考虑这个辅助方法:
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
答案 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