2012-07-16 62 views
7

我通過omniauth從facebook獲取嵌套數組並檢查它是否爲空?/ nil?/ exists? 懸垂線的樣子:如何捕捉「未定義的方法`[]'nil:NilClass」錯誤?

unless omniauth['extra']['raw_info']['location']['name'].nil? 

這應該檢查陣列的這部分是空的或存在。

但總是被拋出這個錯誤:

undefined method `[]' for nil:NilClass 

不要我檢查數組錯了嗎?

我試過用「has_key」「nil?」 「空的?」 「存在?」 「空白?」

但這些作品中沒有一個!

請幫助我,非常感謝提前!

回答

12

發生此錯誤是因爲omniauth['extra']['raw_info']['location']['name'].nil?鏈中的一個哈希值返回nil,並且它不是最後一次調用['name']。

例如,如果omniauth['extra']['raw_info']返回零,您實際上試圖調用nil['location'],這會在ruby中引發錯誤。

你能趕上這個錯誤簡單:

res = omniauth['extra']['raw_info']['location']['name'].nil? rescue true 

unless res 
    #your code here 
end 

請注意,代碼塊以上將填補可變資源與真要是[「名」]哈希值是零或任何其他哈希值鏈返回零。

+0

嗨埃雷茲, 謝謝你,但我怎麼能說「如果你是零......」執行下一行? – Jan 2012-07-16 10:05:32

+0

如果res是真的 - 其中一個omniauth哈希值返回nil – 2012-07-16 10:09:13

+0

許多非常感謝埃雷茲:) – Jan 2012-07-16 10:09:49

12

理想情況下,您應該檢查每個嵌套級別,看看它是否是nil,但是,這也會起作用。

unless (omniauth['extra']['raw_info']['location']['name'] rescue nil).nil? 

您也可以特意解救NoMethodError

4

有點遲到了,但是,正如指出的this answer,紅寶石2.3.0 introduced a new method稱爲,這將返回nil如果鏈接的關鍵之一就是nil。然後,您omniauth權威性哈希可表示爲:

omniauth = { 
      ...     
      "extra"=>{ "raw_info"=> 
         { "location"=>"New York", 
          "gravatar_id"=>"123456789"}} 
      ... 
      } 


omniauth.dig('extra', 
      'raw_info', 
      'location', 
      'name', 
      'foo', 
      'bar', 
      'baz') #<= nil 
+1

或'omniauth.dig(*%w [extra raw_info location name foo bar baz])'如果所有內部標點符號都難以讀取。 – 2016-10-11 20:00:04

相關問題