我通过omniauth从facebook获得一个嵌套数组,并想检查它是否为空?/ nil?/ exists? 依赖行看起来像:
unless omniauth['extra']['raw_info']['location']['name'].nil?
这应该检查数组的这一部分是否为空或存在。
但总是抛出这个错误:
undefined method `[]' for nil:NilClass
我检查数组是否错误?
我用“has_key”“nil尝试了吗?” “空的?” “存在?” “空白?”
但这些作品中没有一个有效!
请帮助我,非常感谢提前!
答案 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