假设我有一个实例变量@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行似乎很遗憾。能够在打印时完成错误处理会很好。
答案 0 :(得分:2)
您可以使用try()
方法轻松完成此操作。我一直都在使用它。
<%= @n.try( :title ) %>
如果nil
为@n
或nil
方法在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#dig
和Hash#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 %>