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专门解救.
派对有点晚了,但是,正如在这个答案中指出的那样,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)
| 归档时间: |
|
| 查看次数: |
10237 次 |
| 最近记录: |