2012-07-16 16 views
7

Ottengo un array nidificato da Facebook via omniauth e voglio controllare se è vuoto?/Nil?/Esiste? linea in base assomiglia:Come catturare un errore "metodo non definito` [] 'per nil: NilClass "?

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

Questo dovrebbe verificare se questa parte della matrice è vuoto o non esiste.

Ma sempre questo errore è stato gettato:

undefined method `[]' for nil:NilClass 

faccio a controllare gli array di sbagliato?

L'ho provato con "has_key" "nil?" "vuoto?" "Esiste?" "Vuoto?"

Ma nessuno di questi lavori!

Per favore aiutatemi, molte grazie in anticipo!

risposta

12

Questo errore viene generato perché uno dei valori hash nella catena di omniauth['extra']['raw_info']['location']['name'].nil? restituisce zero e non è l'ultima chiamata ['nome'].

Se ad esempio omniauth['extra']['raw_info'] rendimenti pari a zero, si sta effettivamente cercando di chiamare nil['location'] che solleva un errore in Ruby.

Si può prendere questo errore semplicemente:

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

unless res 
    #your code here 
end 

Si prega di notare che il blocco di codice sopra riempirà la res variabili con vero se il [ 'name'] valore di hash è nullo o qualsiasi altro valore hash nel catena restituisce nulla.

+0

Hi Erez, grazie, ma come posso dire "se si è nil ..." eseguire le prossime righe? – Jan

+0

se res è vero - uno dei valori dell'hash omniauth restituito nil –

+0

molte, molte grazie Erez :) – Jan

12

Idealmente si dovrebbe verificare ogni livello annidato per vedere se è nil, tuttavia, questo funzionerà anche.

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

È inoltre possibile salvare la NoMethodError specifico.

4

Un po 'in ritardo alla festa, ma, come ha sottolineato in this answer, Ruby 2.3.0 introduced a new method chiamato , che sarebbero tornati nil se una delle chiavi incatenati è nil. Il tuo omniauth auth hash potrebbe poi essere presentato come:

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


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

Oppure 'omniauth.dig (*% w [nome posizione extra raw_info foo bar baz]) 'se la punteggiatura interna è difficile da leggere. –

Problemi correlati