Ruby on rails 只显示rails 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

我发现在显示用户信息时,我在ERB视图中使用了大量重复代码。沿着

<% 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
on
nil
只需安全返回
nil
,无错误。

使用此选项可以避免这些错误

user.andand.name


它将检查用户对象是否为零,然后不要在其上调用名称。

您也可以选择此项:

<%= @user.name if @user.name.present? %>


但是,如果您重复完全相同的操作,最好的方法是在您的助手中创建def作为。

您可以内联测试
IIRC
这正是我想要的,谢谢您为我指明了正确的方向