2012-07-16 25 views
7

Obtengo una matriz anidada de Facebook a través de omniauth y quiero verificar si está vacía?/Nil?/Exists? la línea según se ve así:Cómo capturar un "método indefinido` [] 'para nil: NilClass "error?

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

Esto debería comprobar si esta parte de la matriz está vacía o si existe.

Pero siempre fue lanzado este error:

undefined method `[]' for nil:NilClass 

puedo comprobar las matrices mal?

Lo intenté con "has_key" "nil?" "¿vacío?" "existe?" "¿blanco?"

¡Pero ninguno de estos funciona!

Por favor, ayúdenme, muchas gracias de antemano!

Respuesta

12

Este error se produce porque uno de los valores hash en la cadena de omniauth['extra']['raw_info']['location']['name'].nil? devuelve nil y no es la última llamada ['nombre'].

Si, por ejemplo, omniauth['extra']['raw_info'] devuelve nulo, en realidad está intentando llamar al nil['location'], lo que genera un error en ruby.

Puede encontrar este error simplemente:

res = omniauth['extra']['raw_info']['location']['name'].nil? rescue true 

unless res 
    #your code here 
end 

Tenga en cuenta que el bloque de código anterior llenar la res variables con cierto si el [ 'nombre'] valor hash es nula o cualquier otro valor hash en el la cadena devuelve nil.

+0

Hola Erez, gracias, pero ¿cómo se puede decir que "si usted es nula ..." ejecutar las siguientes líneas? – Jan

+0

si res es verdadero - uno de los valores hash omniauth devueltos nil –

+0

muchas, muchas gracias Erez :) – Jan

12

Lo ideal es que compruebe cada nivel anidado para ver si es nil, sin embargo, esto también funcionará.

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

También puede rescatar el NoMethodError específicamente.

4

Un poco tarde a la fiesta, pero, como se señaló en this answer, Ruby 2.3.0 introduced a new method llamada , que regresarían nil si una de las claves es nil encadenados. Su OmniAuth hash de autenticación podría entonces ser presentado como:

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


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

O 'omniauth.dig (*% w [nombre de ubicación de raw_info foo bar baz])' si toda la puntuación interna es difícil de leer. –

Cuestiones relacionadas