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

时间:2014-07-11 07:45:01

标签: ruby-on-rails ruby erb rescue

问题很简单:

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

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

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

4 个答案:

答案 0 :(得分:9)

我认为这是一种不好的做法,因为rescue用于例外,如果某个地方发生了错误,你就不知道了。

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

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

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

答案 1 :(得分:9)

在Rails中使用try method

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

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

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

答案 2 :(得分:3)

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

尝试使用以下尝试方法尝试方法的三元运算符

...

&lt;%= @ customer.try(:address).present? ? @ customer.try(:address).try(:city).try(:name):&#34; - &#34;%&gt;

...

您还可以在条件部分链接 尝试方法。

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

希望有所帮助......

NARKOZ也是一种很好的做法。

谢谢!

答案 3 :(得分:0)

问题:

...
<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>
...