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

Jan*_*Jan 9 ruby ruby-on-rails

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

 unless omniauth['extra']['raw_info']['location']['name'].nil?
Run Code Online (Sandbox Code Playgroud)

这应该检查数组的这一部分是空的还是存在的.

但总是抛出这个错误:

undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

我检查数组错了吗?

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

但这些都没有!

请帮帮我,非常感谢!

Ere*_*bih 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
Run Code Online (Sandbox Code Playgroud)

请注意,如果['name']哈希值为nil或链中的任何其他哈希值返回nil,则上面的代码块将填充变量res为true.


d11*_*wtq 12

理想情况下,您应该检查每个嵌套级别以查看它是否nil,但是,这也将起作用.

unless (omniauth['extra']['raw_info']['location']['name'] rescue nil).nil?
Run Code Online (Sandbox Code Playgroud)

你也可以NoMethodError专门解救.


dim*_*nyc 5

派对有点晚了,但是,正如在这个答案中指出的那样,Ruby 2.3.0 引入了一个名为的新方法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
Run Code Online (Sandbox Code Playgroud)