无法访问 .rb 文件 (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

希望有帮助。

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

最新更新