【问题标题】:rescue in erb template good practice?erb模板中的救援良好做法?
【发布时间】:2014-07-11 07:45:01
【问题描述】:

问题很简单:

这样使用救援是个好习惯吗?

...
    <td><%= @customer.address.city.name rescue "-" %></td>
    <td><%= @customer.address.province.name rescue "-" %></td>
    <td><%= @customer.address.country.name rescue "-" %></td>
...

如果没有,解决方案在哪里?一个“如果”之前?

【问题讨论】:

  • 我认为这是@Зелёный 在 NARKOZ 帖子的评论中公开的最佳解决方案。

标签: ruby-on-rails ruby erb rescue


【解决方案1】:

在 Rails 中使用 try method

<td><%= @customer.address.city.try(:name) || '-' %></td>

在 Ruby 2.3+ 中,您可以使用原生 safe navigation operator

<td><%= @customer&.address&.city&.name || '-' %></td>

【讨论】:

  • 但如果 @customer.address 返回 nil ?我会使用try 链吗?喜欢@customer.address.try(:city).try(:name)。我不使用try
  • 当您向可能返回nil 的视图中的对象发送消息时,或者当对象没有响应该消息时,您应该自行解决这个问题。使用try 只会加剧问题,就像nil-checking 一样。编写行为一致的一致接口。
  • 感谢您告诉我们这个不错的功能
【解决方案2】:

我认为这是不好的做法,因为rescue 用于异常,如果某处发生错误,您不知道。

使用 if 条件或三元运算符或其他东西,但不要在这种情况下使用救援:

<td><%= @customer.address.city.name if @customer.address %></td>
<td><%=  @customer.address ? @customer.address.city.name : '-' %></td>

如果您希望 Rails 方式将此逻辑移动到 ApplicationHelper 或使用 Drapper gem。

【讨论】:

    【解决方案3】:

    不,在视图页面中使用救援不是最佳做法。

    尝试以下 三元运算符 以及 try 方法:

    ...

    ...

    您也可以在条件部分chain try 方法。

    三元运算符类似于if else条件,但我们不需要用if-else进行多行编码。

    希望对你有帮助..

    NARKOZ 也是一种很好的做法。

    谢谢!!

    【讨论】:

      【解决方案4】:

      问题:

      ...
      <td><%= @customer.address.city.name rescue "-" %></td>
      <td><%= @customer.address.province.name rescue "-" %></td>
      <td><%= @customer.address.country.name rescue "-" %></td>
      ...
      

      解决办法:

      ...
      <td><%= (@customer.address && @customer.address.city && @customer.address.city.name) || "-" %></td>
      <td><%= (@customer.address && @customer.address.province && @customer.address.province.name) || "-" %></td>
      <td><%= (@customer.address && @customer.address.country && @customer.address.country.name) || "-" %></td>
      ...
      

      【讨论】:

      • 还有比这更糟糕的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多