Ruby on rails 只显示rails ERB中存在的记录的优雅方式
我发现在显示用户信息时,我在ERB视图中使用了大量重复代码。沿着Ruby on rails 只显示rails ERB中存在的记录的优雅方式,ruby-on-rails,ruby,erb,Ruby On Rails,Ruby,Erb,我发现在显示用户信息时,我在ERB视图中使用了大量重复代码。沿着 <% if @user.name.present? %> <%= @user.name %> <% end %> 在我看来,我这样做基本上是为了避免错误(例如,可能没有所有新字段的老用户) 有更好的方法吗?将逻辑移到助手中: def name_for(user) user.name if user.name.present? end 并在视图中调用该帮助器: <%= name
<% if @user.name.present? %>
<%= @user.name %>
<% end %>
在我看来,我这样做基本上是为了避免错误(例如,可能没有所有新字段的老用户)
有更好的方法吗?将逻辑移到助手中:
def name_for(user)
user.name if user.name.present?
end
并在视图中调用该帮助器:
<%= name_for(@user) %>
请注意,对没有名称的用户调用
@user.name
不会产生错误。如果@user.name
为nil
,则只有在尝试调用nil
上的其他方法时才会发生错误,例如@user.name.upcase
因此,如果您的条件没有包含视图的任何其他部分,并且如果用户没有名称,您很乐意留下一个空白,那么您可以使用@user.name
,而无需选中if
复选框
如果您有一个更复杂的示例,还可以查看使用try
。例如,如果用户属于某个组,但某些较老的用户没有组,则可以显示组名:
@user.group.try(:name)
try
onnil
只需安全返回nil
,无错误。
使用此选项可以避免这些错误
user.andand.name
它将检查用户对象是否为零,然后不要在其上调用名称。您也可以选择此项:
<%= @user.name if @user.name.present? %>
但是,如果您重复完全相同的操作,最好的方法是在您的助手中创建def作为。您可以内联测试
IIRC
这正是我想要的,谢谢您为我指明了正确的方向