2015-11-05 138 views
0

假设我有一个实例变量@n,在我看来,我打电话给<%= @n.title %>有没有办法让控制台忽略某些错误?

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

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

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

<%= @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

你可以用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

EDIT(2016年1月11日)

您现在可以使用“保险箱导航运营商“截至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'] 
+0

你能用这个链接吗?例如,用'<%= link_to @ n.try(:title),raze_path%>',如果'@ n'为零,则不打印任何内容,而是打印'raze_path'的url输出。我可以通过链接打印什么吗? –

0

您可以在视图中添加一些逻辑来区分开发(其中一些错误可以忽略)和生产环境(错误应该导致您的应用程序以明显丑陋的方式失败)。 Ruby的nil具有“虚假”的性质,所以你可以使用这个概念来获得你的好处。

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

是否可以在没有条件语句的情况下完成此操作? –

+0

那么,首先不要设置“@ n”是“错误的”,所以我不确定你的期望在这里完全是现实的。如果您不想使用条件,请确保在控制器中正确设置字段。在这种情况下,我不确定简洁的代码是您的首要任务。您还可以通过将环境测试与'@ n'的测试结合起来,使我的代码更加简洁,进一步节省了几行。 – MarsAtomic

相关问题