2011-10-06 3 views
8

Sto cercando di accedere alla sessione corrente da after_authenticate callback di Warden (esecuzione sotto Devise) in Rails 3.Come accedere sessione da Warden/Elaborare after_authentication richiamata in Rails

Nella parte superiore della mia application controller voglio fare qualcosa di simile:

Warden::Manager.after_authentication do |user,auth,opts| 
    user.associate_with_ids(session[:pending_ids]) 
end 

l'obiettivo finale è quello di prendere un elenco di ID dei record che sono stati memorizzati nella sessione prima di iscriversi e associarli con il modello utente dopo Entra

Qualsiasi aiuto sarebbe. essere molto app reciated.

risposta

21

"auth.session" GET/imposta i dati del chiave di sessione "warden.user. # {} portata .session".

Supponiamo che aveva salvato pending_ids all'interno della vostra applicazione Rails:

session[:pending_ids] = ... 

e si voleva accesso nel gancio guardiano, è possibile accedere in questo modo:

Warden::Manager.after_authentication do |user,auth,opts| 
    user.associate_with_ids(auth.env['rack.session'][:pending_ids]) 
end 

Mi c'è voluto un po ' per scoprirlo, quindi penso che potrebbe essere di qualche aiuto per qualcuno.

(originariamente preso da dioscoscataglini.com/2012/02/09/383/manipulating-sessions-in-wardendevise, che ora è morto).

+1

Questo ha funzionato per me, la risposta qui sotto auth.session non ha fatto. – cpuguy83

+0

Grazie! Questo è un piccolo grande trucco! – LukeS

2

È possibile accedere al negozio di sessione via auth:

Warden::Manager.after_authentication do |user,auth,opts| 
    user.associate_with_ids(auth.session[:pending_ids]) 
end 
+0

ho scoperto che auth.session non ha funzionato. Esiste, ma non è uguale alla sessione dal contesto del controller. – cpuguy83

+0

Quando faccio che ottengo non definita variabile locale o metodo 'session' per #

-2

si possono anche trovare l'intera sessione dal auth.raw_session

0

È inoltre possibile accedere alla sessione attraverso auth.request.session.

Così il vostro esempio può essere:

Warden::Manager.after_authentication do |user,auth,opts| 
    user.associate_with_ids(auth.request.session[:pending_ids]) 
end