优雅的方式只显示记录,如果它们存在于轨道ERB

时间:2015-05-07 16:13:59

标签: ruby-on-rails ruby erb

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

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

我基本上是为了避免错误(例如可能没有所有新字段的老用户)而在我的视图中执行此操作。

有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

将逻辑移动到帮助器中:

def name_for(user)
 user.name if user.name.present?
end

在你的观点中调用那个助手:

<%= name_for(@user) %>

答案 1 :(得分:1)

请注意,在没有名称的用户上调用@user.name不会产生错误。如果@user.namenil,则只有在您尝试在nil上调用其他方法时才会出现错误,例如@user.name.upcase

因此,如果您的条件没有包含视图的任何其他部分,并且您很乐意在用户没有名称时留下空白,则可以使用@user.name而不使用{{ 1}}检查。

如果您有一个更复杂的示例,您还可以查看使用if。例如,如果用户属于某个组,但某些较旧的用户没有组,则可以显示组名称:

try
@user.group.try(:name) 上的{p> try只是安全地返回nil而没有错误。

答案 2 :(得分:0)

https://github.com/raganwald/andand

使用它来避免这些错误

user.andand.name

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

答案 3 :(得分:0)

你也可以选择这个:

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

但如果你重复完全相同的事情,最好的方法是在助手中创建一个def Florent pointed out