现在,我的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
希望有帮助。
为什么不在"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 函数并只留下一个语句,因为将返回最后一个计算结果。