如何为nil捕获“未定义的方法`[]”:NilClass“错误?

时间:2012-07-16 09:54:33

标签: ruby-on-rails ruby

我通过omniauth从facebook获得一个嵌套数组,并想检查它是否为空?/ nil?/ exists? 依赖行看起来像:

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

这应该检查数组的这一部分是否为空或存在。

但总是抛出这个错误:

undefined method `[]' for nil:NilClass

我检查数组是否错误?

我用“has_key”“nil尝试了吗?” “空的?” “存在?” “空白?”

但这些作品中没有一个有效!

请帮助我,非常感谢提前!

3 个答案:

答案 0 :(得分:13)

引发此错误是因为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为真。

答案 1 :(得分:12)

理想情况下,您应该检查每个嵌套级别以查看它是否为nil,但是,这也可以。

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

您还可以专门拯救NoMethodError

答案 2 :(得分:5)

派对有点晚了,但正如this answer中指出的那样,Ruby 2.3.0 introduced a new method称为dig,如果其中一个链接,则返回nil键是nil。您的omniauth auth哈希可以表示为:

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


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