在erb模板中抢救好的做法?

Jav*_*cia 3 ruby ruby-on-rails erb rescue

问题很简单:

像这样使用救援是一种很好的做法吗?

...
    <td><%= @customer.address.city.name rescue "-" %></td>
    <td><%= @customer.address.province.name rescue "-" %></td>
    <td><%= @customer.address.country.name rescue "-" %></td>
...
Run Code Online (Sandbox Code Playgroud)

如果不是,解决方案在哪里?之前的"如果"?

NAR*_*KOZ 10

在Rails中使用try方法:

<td><%= @customer.address.city.try(:name) || '-' %></td>
Run Code Online (Sandbox Code Playgroud)

在Ruby 2.3+中,您可以使用本机安全导航操作符:

<td><%= @customer&.address&.city&.name || '-' %></td>
Run Code Online (Sandbox Code Playgroud)

  • 当您向可能返回"nil"的视图中的对象发送消息时,或者当对象没有响应该消息时,这是您应该自己解决的问题.使用`try`只会加剧问题,就像`nil`-checking一样.编写一致行为的一致接口. (3认同)

Зел*_*ный 9

我认为这是一种不好的做法,因为rescue对于异常,如果某个地方发生了错误,你就不知道了.

如果是条件或三元运算符或其他东西,但在这种情况下不使用rescue,请使用:

<td><%= @customer.address.city.name if @customer.address %></td>
<td><%=  @customer.address ? @customer.address.city.name : '-' %></td>
Run Code Online (Sandbox Code Playgroud)

如果你想让Rails方式移动这个逻辑ApplicationHelper或使用Drapper gem.