[英]Cannot access variable in function in .rb file (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 = 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>
有关如何解决此错误的任何提示? 谢谢!
更新:我已经将方法移到了get
块之外,但是现在我遇到了一个新错误: undefined local variable or method
项目'`
project
变量在方法的外部和上方定义。
还值得注意的是,我在其他get块中使用了project
变量。
改用助手:
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的答案,而不是上面的代码,可以通过为该对象提供帮助器来避免undefined method project
错误。 就像是:
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
希望能有所帮助。
为什么不在“获取”功能之外创建此功能?
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函数,仅保留一条语句,因为将返回最后的计算结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.