2013-08-22 37 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?} 
相關問題