考虑这个辅助方法:
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
考虑这个辅助方法:
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
像这样的东西?
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 约定。
您可以分解调用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
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