【问题标题】:Elegant way to only show records if they exist in rails ERB仅显示存在于 rails ERB 中的记录的优雅方式
【发布时间】:2015-05-07 16:13:59
【问题描述】:

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

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

我基本上对我认为的所有内容都这样做以避免错误(例如,可能没有所有新字段的老用户)。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你可以内联测试&lt;%= @user.name if @user.name.present? %&gt;IIRC
  • &lt;%= @user.try :name %&gt;

标签: ruby-on-rails ruby erb


【解决方案1】:

将逻辑移到帮助器中:

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

并在您的视图中调用该助手:

<%= name_for(@user) %>

【讨论】:

  • 正是我想要的,感谢您为我指明正确的方向
【解决方案2】:

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

因此,如果您的条件没有包含视图的任何其他部分,并且您很乐意在用户没有姓名的情况下留下一个空白区域,您可以使用 @user.name 而不使用 if 检查.

如果您有更复杂的示例,也可以使用try。例如,如果用户属于某个组,但一些年长的用户没有组,您可以显示组名:

@user.group.try(:name)

nil 上的try 只是安全地返回 nil 而不会出错。

【讨论】:

    【解决方案3】:

    https://github.com/raganwald/andand

    使用它来避免这些错误

    user.andand.name

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

    【讨论】:

      【解决方案4】:

      你也可以选择这个:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-07
        • 2013-03-26
        • 2016-04-16
        • 1970-01-01
        • 2016-12-11
        • 2010-11-04
        • 2014-02-03
        • 1970-01-01
        相关资源
        最近更新 更多