0

現在、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 methodproject'`

project変数はメソッドの外と上で定義されます。

projectこの変数を他の get ブロックで使用していることにも注目してください。

4

2 に答える 2

1

代わりにヘルパーを使用します。

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その1つのオブジェクトのヘルパーを持つことでエラーを回避できます。何かのようなもの:

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

それが役立つことを願っています。

于 2012-08-09T07:06:30.423 に答える
0

この関数を「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 関数を短くしてステートメントを 1 つだけ残すこともできます。

于 2012-08-08T14:59:41.527 に答える