9

我通过omniauth从facebook得到一个嵌套数组,想检查它是否为空?/nil?/exists?依赖行如下所示:

 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

引发此错误是因为链中的哈希值之一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,则上面的代码块将用 true 填充变量 res。

于 2012-07-16T09:56:23.510 回答
6

派对有点晚了,但是,正如这个答案中所指出的,Ruby 2.3.0引入了一个名为的新方法,如果其中一个链接的键是dig,它将返回。然后,您的 omniauth 身份验证哈希可以显示为: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 回答