繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM