2013-04-08 4 views
5

Devise sta lanciando un problema che non capisco.Anonimo Devise Problema: "[17] non è un simbolo"

Utilizzo di errori migliori gemma; Ecco dove viene catturato:

blocco constantize (GEM) ActiveSupport-3.2.12/lib/active_support/inflettore/methods.rb

225   names = camel_cased_word.split('::') 
    226   names.shift if names.empty? || names.first.empty? 
    227 
    228   constant = Object 
    229   names.each do |name| 
    230   constant = constant.const_defined?(name, false) ? 
        constant.const_get(name) : constant.const_missing(name) 
    231   end 
    232   constant 
    233  end 
    234  end 

Ulteriori dettagli:

Request info: 
Request parameters {"controller"=>"devise/sessions", "action"=>"new"} 
Rack session  {"session_id"=>"a2bcc708204fb5dce015439f6881f67d","_csrf_token"=>"TzIKUgPy8y4F6kFfkDG/xfgCm4vMqkgReLHbK+cjeFI=", "warden.user.user.key"=>[[17], "$2a$10$/WvxkLxIdgHOMxg8nus6cu"]} 


Local Variables: 
name  [17] 
camel_cased_word [17] 
names [[17]] 
constant Object 

Tutte le idee ? Quali ulteriori informazioni sarebbero utili?

Ecco un pezzo fuori alla fine della traccia:

block in ActiveSupport::Inflector.constantize 
(gem) activesupport-3.2.12/lib/active_support/inflector/methods.rb, line 230 
ActiveSupport::Inflector.constantize 
(gem) activesupport-3.2.12/lib/active_support/inflector/methods.rb, line 229 
Warden::SessionSerializer#deserialize 
(gem) devise-2.2.3/lib/devise/rails/warden_compat.rb, line 27 
Warden::SessionSerializer#fetch 
(gem) warden-1.2.1/lib/warden/session_serializer.rb, line 35 
Warden::Proxy#user 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 212 
Warden::Proxy#_perform_authentication 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 318 
Warden::Proxy#authenticate 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 104 
Warden::Proxy#authenticate? 
(gem) warden-1.2.1/lib/warden/proxy.rb, line 114 
Devise::SessionsController#require_no_authentication 
(gem) devise-2.2.3/app/controllers/devise_controller.rb, line 124 
Devise::SessionsController# 
_run__642094268016367352__process_action__582726832569976772__callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 418 
Devise::SessionsController.__run_callback 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 405 
Devise::SessionsController#_run_process_action_callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 385 
Devise::SessionsController#run_callbacks 
(gem) activesupport-3.2.12/lib/active_support/callbacks.rb, line 81 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/abstract_controller/callbacks.rb, line 17 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/rescue.rb, line 29 
block in Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/instrumentation.rb, line 30 
block in ActiveSupport::Notifications.instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications.rb, line 123 
ActiveSupport::Notifications::Instrumenter#instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb, line 20 
ActiveSupport::Notifications.instrument 
(gem) activesupport-3.2.12/lib/active_support/notifications.rb, line 123 
Devise::SessionsController#process_action 
(gem) actionpack-3.2.12/lib/action_controller/metal/instrumentation.rb, line 29 
Devise::SessionsController#process_action 
+2

Hai appena aggiornato Devise? Se sì, da- e per- quale versione? – rossta

+1

Sì e no. In precedenza avevo semplicemente collegato direttamente al repository con: 'gem 'devise',: git => 'git: // github.com/plataformatec/devise.git''. Ho aggiunto questo nel mio gemfile e sembra aver risolto il problema. Grazie mille. Cosa ti ha portato ad assumere che avessi aggiornato, comunque? –

+3

Era un'ipotesi considerando che stavi ricevendo l'errore mentre deserializzava i tuoi dati di sessione. Se il codice da serializzare/deserializzare cambia, come potrebbe in un aggiornamento/downgrade, vedresti degli errori che deserializzano le sessioni già esistenti. – rossta

risposta

3

ho aggiornato da 2.0.4 a 2.2.4 e che mi è capitato quando ho cambiato ad un ramo stabile del mio progetto con la vecchia versione. La soluzione era di cancellare tutti i cookie nel browser per il mio localhost. Nel tuo caso sarebbe il server in cui stai eseguendo la tua applicazione.

+0

Questo ha reso la mia giornata - mezza giornata di scarico pensavo !! Saluti. –

0

La domanda è stata postata molto tempo fa quindi suppongo che la persona originale non abbia più bisogno della risposta. Ma potrebbero esserci persone come me che hanno un disperato bisogno di una risposta oltre a far esplodere tutte le sesssezioni. Ecco la causa e la mia soluzione: Devise 2.2.4 ha modifiche incompatibili con le versioni precedenti che interrompono tutte le sessioni esistenti. Vedere il registro delle modifiche per 2.2.4 https://github.com/plataformatec/devise/blob/master/CHANGELOG.md

sessioni create da disposizione testamentaria> = 2.2.4 non può essere gestito correttamente da disposizione testamentaria < = 2.2.3.

Il problema deriva dai tasti di sessione utilizzati. Diciamo che hai ideato il tuo modello di lettore. Per disposizione testamentaria < = 2.2.3, la sessione ha la seguente nella sessione

session["warden.user.player.key']=["Player", [player_id], "somehashhere"] 

Per disposizione testamentaria> = 2.2.4, la seduta diventa il seguente

session["warden.user.player.key']=[[player_id], "somehashhere"] 

Suppongo che l'autore concepire don' Mi piace il "Player" come è già specificato in molti posti diversi, così come la chiave stessa. È un cambiamento ragionevole e il nuovo codice gestisce correttamente l'aggiornamento in quanto può comprendere le vecchie sessioni e mantiene in vita le sessioni in sospeso.

Ma questo risolve solo il problema dell'aggiornamento, non del downgrade. Se aggiorni la tua idea alla 2.2.4, accedi e poi esegui il downgrade alla 2.2.3, vedrai un errore come questo. Apparentemente da qualche parte nel codice elaborato (< 2.2.3) converte il "Play" in simbolo: utente. Ma l''Utente' non c'è più e hai un errore 'non un simbolo'.

Definire i punti della pagina su una soluzione solo se si utilizza la memorizzazione db per la sessione. Si avrebbe bisogno di una migrazione per quella (di default rotaie per lungo tempo) https://gist.github.com/moll/6417606

Se si utilizza cookie di stoccaggio negozio, allora avete bisogno di aggiungere il seguente codice al controllore di applicazione quando si effettua il downgrade dalla versione successiva di concepire

before_filter :fix_session 
def fix_session 
    key = session["warden.user.player.key"] 
    if key && key.is_a?(Array) && key[0].is_a?(Array) 
     session["warden.user.player.key"].unshift('Player') 
    end 
end 

Per quanto riguarda il motivo del downgrade? Se sei sicuro che tutto funzioni e non dovrai mai eseguire il rollback, non è un problema.Ma se non ne sei così sicuro, avrai bisogno di questo.