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

如何重构为更具可读性的东西?

导轨 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

您可以分解调用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 回答