Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法访问.rb文件(sinatra)中函数中的变量_Ruby_Function_Sinatra - Fatal编程技术网

Ruby 无法访问.rb文件(sinatra)中函数中的变量

Ruby 无法访问.rb文件(sinatra)中函数中的变量,ruby,function,sinatra,Ruby,Function,Sinatra,现在,我的rb文件中有这个代码。它工作得很好: project = PivotalTracker::Project.find(123456) get '/' do @accepted = project.stories.all(:current_state => 'accepted').length @delivered = project.stories.all(:current_state => 'delivered').length @finished =

现在,我的rb文件中有这个代码。它工作得很好:

project = PivotalTracker::Project.find(123456)  

get '/' do 
  @accepted = project.stories.all(:current_state => 'accepted').length
  @delivered = project.stories.all(:current_state => 'delivered').length
  @finished = project.stories.all(:current_state => 'finished').length    

  erb :home
end
我想创建一个
totalStories
函数来使用,而不是使用3行冗长的冗余代码

因此,我尝试了以下方法:

get '/' do 
  @accepted = totalStories('accepted')
  @delivered = totalStories('delivered')
  @finished = totalStories('finished')

  def totalStories(storyState)
    var estimate = project.stories.all(:current_state => storyState).length
    return var
  end

  erb :home
end
使用此代码,我得到一个错误:

NoMethodError at /
undefined method `totalStories' for #<Sinatra::Application:0x007f89bae6c800>
NoMethodError at/
未定义的方法“totalStories”#
有关如何解决此错误的任何提示?谢谢

更新: 我已将该方法移到
get
块之外,但现在我得到一个新错误:
未定义的局部变量或方法
项目'`

项目
变量在方法外部和上方定义


还值得注意的是,我在其他get块中使用了
project
变量。

为什么不在“get”函数之外创建此函数

def totalStories(storyState)
    project.stories.all(:current_state => storyState).length
end

get '/' do 
  @accepted = totalStories('accepted')
  @delivered = totalStories('delivered')
  @finished = totalStories('finished')

  erb :home
end
您也可以缩短totalStories函数,只留下一条语句,因为最后一次计算的结果将被返回。

请改用助手:

get '/' do
  @accepted = total_stories('accepted') 
  @delivered = total_stories('delivered')
  @finished = total_stories('finished')

  erb :home
end

helpers do
  def total_stories(option)
    # project = PivotalTracker::Project.find(123456)
    project.stories.all(:current_state => option).length
  end
end
添加@sergey的答案,而不是上面的代码,您可以通过为一个对象指定一个助手来避免
未定义的方法项目
错误。比如:

get '/' do
  # same code
end

def total_stories(option)
  project(12345).stories.all(:current_state => option).length
  # The project object here causes an error since it looks for a 
  # project method (yes, instead of object) under Sinatra's Base or Application
  # hence, we define the method inside the helpers block
end

helpers do
  def project(id)
    # Here goes the PivotalTracker find method for that particular ID.
  end

end

希望这有帮助。

Ah,但现在我遇到了一个新错误:
未定义的局部变量或方法“project”
project是在函数外部(也在“get”外部)定义的变量。(我可以在函数中定义
project
,但它将是一行重复的代码,因此看起来不正确)这个变量定义在哪里?它存储了什么?在my.rb文件的顶部(在'require'行之后)。我正在使用Pivotal Tracker API(一个项目管理器系统),它存储我的项目信息(
project=PivotalTracker::project.find(123456)
)。我希望它可以在
totalStories
函数中访问。您可以将其设置为类变量-@@projectthank you kashyap!不幸的是,即使有了helpers(您的第一个代码块),我得到了“未定义的局部变量或方法‘project’”,现在我将尝试第二种方法,第一个代码块只有在我将
project
更改为
$project
时才起作用,尽管根据我读到的一些文章,这似乎是不好的做法?在第一个代码块中,您定义了什么是project吗?我已经加了这句话作为评论。请尝试删除
。啊,是的,但我在其他get块中也使用了
项目。