9

フェイスブックからomniauthを介してネストされた配列を取得し、それが空かどうかを確認したいですか?/ nil?/存在しますか?依存する行は次のようになります。

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

これにより、配列のこの部分が空であるか存在するかを確認する必要があります。

しかし、常にこのエラーがスローされました:

undefined method `[]' for nil:NilClass

配列を間違ってチェックしますか?

「has_key」「nil?」で試してみました "空?" 「存在する?」"空欄?"

しかし、これらの作品はどれもありません!

助けてください、よろしくお願いします!

4

3 に答える 3

14

理想的には、ネストされた各レベルをチェックして、そうであるかどうかを確認する必要がありますがnil、これも機能します。

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

具体的に救助することもできますNoMethodError

于 2012-07-16T09:59:40.387 に答える
13

このエラーは、チェーン内のハッシュ値の1つがomniauth['extra']['raw_info']['location']['name'].nil?nilを返し、それが['name']の最後の呼び出しではないために発生します。

たとえばomniauth['extra']['raw_info']、nilを返す場合、実際に呼び出しようとしnil['location']ているため、rubyでエラーが発生します。

このエラーは簡単に見つけることができます。

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

unless res
  #your code here
end

['name']ハッシュ値がnilの場合、またはチェーン内の他のハッシュ値がnilを返す場合、上記のコードブロックは変数resをtrueで埋めることに注意してください。

于 2012-07-16T09:56:23.510 に答える
6

パーティーに少し遅れましたが、この回答で指摘されているように、Ruby 2.3.0は、と呼ばれる新しいメソッドを導入しました。これは、チェーンされたキーの1つがである場合digに返されます。omn​​iauth認証ハッシュは次のように表示されます。nilnil

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


omniauth.dig('extra', 
             'raw_info',
             'location',
             'name',
             'foo',
             'bar',
             'baz') #<= nil
于 2016-10-11T19:35:31.957 に答える