Ruby 无法访问.rb文件(sinatra)中函数中的变量
现在,我的rb文件中有这个代码。它工作得很好: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 =
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块中也使用了项目。