2012-06-08 55 views
0

我有一個名爲只有調用一個方法,如果哈希填充

@filtered_ratings = params[:ratings].keys 

但是一個實例變量,如果params[:ratings]是零和#keys被稱爲它存在時引發的錯誤。如果@filtered_ratings爲零,我希望將@filtered_ratings設置爲空數組(或散列)。有沒有一個簡單的方法做到這一點,沒有太多的代碼?謝謝!

回答

2
@filtered_ratings = params[:ratings].keys if params[:ratings].respond_to? :keys 

編輯:

# if params[:ratings] is nil then return [] 
@filtered_ratings = params[:ratings].try(:keys) || [] 
+0

我應該說得更好。如果'@filtered_ratings = params [:ratings] .keys'爲零,我希望將@filtered_ratings設置爲空數組(或散列)。對困惑感到抱歉! – Anconia

+0

@Dylan看我的編輯。 – xdazz

+1

@ Dylan ..如果你想把'@ filtered_ratings'設置爲一個空數組,你應該使用這個@filtered_ratings =(params [:ratings] || {})。keys' – rubyprince

1

試試這個:

@filtered_ratings = params[:ratings].try(:keys) 

如果params[:ratings]nil,它將返回nil以及(而不是提高誤差)。

另外,您當然可以在空散列({})上調用#keys。但是nil不是其中之一。

+0

你是對的。這是我的錯誤。 – Anconia

1

我會用andand寶石,因爲我已經習慣了:

@filtered_ratings = params[:ratings].andand.key 

這將設置@filtered_ratings爲零,或關鍵值 - 可能或可能不是你想要的。

+0

Rails有'#try'。它看起來(對我來說)太麻煩了,只爲了捆綁一個寶石。但是,如果你把它捆綁起來... :) –

+1

@SergioTulentsev如果是一次性使用,我不會。我更喜歡它的可讀性,當我打破德米特的心時,它對我來說更加乾淨:)我也做了足夠的非Rails Ruby編碼,我只是習慣於將它編碼而不用重寫公認的簡單,更短的替換。 –

+0

@DaveNewton非常有趣的寶石 - 我會記住,當時間到了。 – Anconia