有没有办法让控制台忽略某些错误?

时间:2015-11-05 03:35:34

标签: ruby-on-rails ruby error-handling null

假设我有一个实例变量@n,并且我在我的视图中调用了<%= @n.title %>

如果@n等于有效记录,则会正常打印。但如果@n为空或无效,那么整个页面都会显示错误消息,因为这一行很少。

如果@n.title为零或无效,有没有办法让@n只打印nil?

我正在寻找一种没有条件陈述的方法。例如,如果我想打印

<%= @v1.title %>,<%= @v2.title %>,<%= @v3.title %>,<%= @v4.title %>,

如果我想使用条件打印而不出错,则需要12行代码:

<% if @v1 %>
  <%= @v1.title %>,
<% end %>
<% if @v2 %>
  <%= @v2.title %>,
<% end %>
<% elsif @v3 %>
  <%= @v3.title %>,
<% end %>
<% elsif @v4 %>
  <%= @v4.title %>,
<% end %>

在这上面使用12行似乎很遗憾。能够在打印时完成错误处理会很好。

2 个答案:

答案 0 :(得分:2)

您可以使用try()方法轻松完成此操作。我一直都在使用它。

 <%= @n.try( :title ) %>

如果nil@nnil方法在title上不存在,则会返回@n

您也可以将它们链接在一起:

 @n.try( :title ).try( :to_s )

甚至在哈希上使用它:

 @n.try( :[], 'name' )  # Which is the same as @n['name']

请参阅http://api.rubyonrails.org/classes/Object.html#method-i-try

编辑(2016年1月11日)

您现在可以使用&#34;安全导航操作员&#34;截至Ruby 2.3.0

 @n&.title&.to_s

以及Ruby 2.3.0中引入的Array#digHash#dig方法。

 hash = { 'name' => 'bob' }
 hash.dig( 'name' )  # Which is the safe way to do hash['name']

答案 1 :(得分:0)

您可以在视图中添加一些逻辑,区分开发(可以忽略某些错误)和生产环境(错误应该导致您的应用以明显和丑陋的方式失败)。 Ruby的nil具有“假”性质,因此您也可以使用该概念。

<% if Rails.env.development? %>
  <% if @n %>
    <%= @n.title %>
  <% else %>
    <%= nil %>
  <% end %>
<% else %>
  <%= @n.title %>
<% end %>