如何重构这个Rails代码?

时间:2012-09-06 14:42:20

标签: ruby-on-rails ruby ruby-on-rails-3 refactoring

考虑这个辅助方法:

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

3 个答案:

答案 0 :(得分: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​​约定附加名称。

答案 1 :(得分: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

答案 2 :(得分:1)

尝试在非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