2013-08-22 42 views
-1

我想打印一个数组/散列键的值,而不会在找不到索引时引发异常。 (注意我不是在寻找救援这里)如何在调用它之前检查数组/散列键是否存在?

<%= content.categories[0].name %> 

在上面的语句中,如果类别为空数组,它会抛出异常。由于我在我的视图中使用此代码,我想要一个非常简短的代码,但如果类别为空,则不会打印任何代码。

+2

当没有找到键/索引时,'Hash#[]'和'Array#[]'不会引发错误。这是'名称',这是一个错误。 – sawa

+0

@sawa'nil.name'肯定会引发错误。 – meagar

+0

@meagar当然。为了给OP提供一个很好的建议,OP必须告诉什么时候(在什么类上)'name'被定义。 – sawa

回答

8

问题不在于你正在访问一个空数组,这很好。访问数组的未定义索引将计算为nil。问题在于你试图调用nil上的一个方法,这会产生一个NoMethodError

使用try,它是专门旨在解决您遇到的问题,这是你正在懒洋洋地避免检查nil调用方法之前:

<%= content.categories[0].try(:name) %> 

你甚至可以链try再次,虽然应避免过度使用try

<%= content.categories[0].try(:name).try(:length) %> 

或者,你可以使用传统的流量控制语句:

<%= content.categories[0].name if content.categories[0] %> 
+0

我认为值得注意的是['try'](http://api.rubyonrails.org/classes/Object.html#method-i-try)在Rails 4中已更改,现在有['try!'] (http://api.rubyonrails.org/classes/Object.html#method-i-try-21),如果你仍然想要Rails 3的行为。 –

+0

@ muistooshort值得注意的是,我认为,尽管在这种情况下并不重要;据我了解,只有'try'的新行为才会在非'nil'对象上调用。我们*绝对*在这里处理'nil.try'。 – meagar

+0

感谢@meagar了解我的要求并提供解决方案,尽管我在分析问题时错了。你的解决方案可以帮助我的需 – shankardevy

0
content.categories.tap{|a| break a[0].name unless a.empty?} 
相关问题