2012-07-16 6 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?のチェーンのハッシュ値の1つが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 

を[「名前」]ハッシュ値がnilかの他のハッシュ値である場合は、上記のコードブロックが真の変数RESを埋めるだろうことに注意してくださいチェーンはnilを返します。

+0

こんにちはエレズが、どのように私は、「あなたがnilであれば...」次の行を実行すると言うことができます:あなたのomniauthの認証ハッシュは次のように提示されるだろうか? – Jan

+0

resがtrueの場合 - omniauthハッシュ値の1つが返されます。 –

+0

多くの、多くの感謝Erez :) – Jan

12

nilであるかどうかを確認するには、それぞれのネストされたレベルを確認するのが理想的ですが、これも機能します。

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

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

4

チェーンの鍵の一つがnilある場合nilを返しますthis answerで指摘したように後半に相手に少し、しかし、と呼ばれるルビー2.3.0 introduced a new method、。 はあなたに感謝し、

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 [特別なraw_infoロケーション名foo bar baz])' –

関連する問題