0

このヘルパーメソッドを検討してください。

module SomeHelper

  def display_button
    Foo.find_by_id params[:id] and Foo.find(params[:id]).organizer.name != current_name and Foo.find(params[:id]).friends.find_by_name current_name
  end

end

より読みやすいものにリファクタリングする方法は?

Rails 3.2.2

4

3 に答える 3

4

このようなもの?

module SomeHelper

  def display_button?
    if foo = Foo.find(params[:id])
      foo.organizer.name != current_name if foo.friends.find_by_name(current_name)
    end
  end

end

注:ヘルパーメソッドがブール値を返す場合は、名前に?...ruby規則を追加します。

于 2012-09-06T14:51:34.823 に答える
2

3番目の条件への呼び出しを因数分解してFoo.find(params[:id])使用できますexists?

module SomeHelper
  def display_button
    foo = foo.find_by_id params[:id]
    foo and foo.organizer.name != current_name and foo.friends.where(:name => current_name).exists?
  end
end

再利用性を高めるためにいくつかのメソッドを作成することもできます(モデルを変更した場合のトラブルを回避できます)。

module SomeHelper
  def display_button
    foo = foo.find_by_id params[:id]
    foo && !is_organizer?(foo, current_name) && has_friend?(foo, current_name)
  end

  def is_organizer?(foo, name)
    foo.organizer.name == name
  end 

  def has_friend?(foo, name)
    foo.friends.where(:name => name).exists?
  end
end
于 2012-09-06T14:52:33.923 に答える
1

tryは、nil以外のオブジェクトで渡されたブロックを呼び出します。それ以外の場合はnilを返します。したがって、データに応じて、戻り値はnil、true、falseになります。

def display_button
    Foo.find_by_id(params[:id]).try do |foo|
       foo.organizer.name != current_name && 
         foo.friends.find_by_name current_name
    end
  end
于 2012-09-06T14:51:51.610 に答える