2009-03-26 6 views

risposta

8

In realtà esiste un modo per eliminare un valore dalla sessione. Come RichH ha detto che la variabile di sessione è un'istanza di CGI :: Session. Quando si immette qualcosa come session[:foo], in realtà viene visualizzato tale simbolo in una variabile di istanza @data nell'oggetto di sessione. Quella variabile di dati è un hash.

MODIFICA: C'è una variabile di istanza di dati nella classe CGI :: Session. Se vai allo docs e guarda il codice sorgente per il metodo []= vedrai che c'è un membro @data.

Quindi, per eliminare session[:foo] tutto quello che dovete fare è di accesso che @data variabili dall'interno della sessione

session.data[:foo] 

Ora per cancellarlo:

session.data.delete :foo 

Una volta fatto questo il non ci dovrebbero essere più foo nella tua variabile di sessione.

+0

È che attraversavano portatile tutti i negozi di sessione? Sembra un po 'intimo in quanto l'attributo dei dati non è menzionato nei documenti. – RichH

+0

Sinceramente non lo so. L'ho scoperto usando il debugger e ispezionando la variabile di sessione. Sono stato in grado di trovare un piccolo supporto per la mia risposta, tuttavia, http://tinyurl.com/cp7ntm, controlla l'ultimo metodo in cui assegna session_data = @ _session.data. Questo è il massimo che ho trovato su di esso – vrish88

+0

Ho appena aggiornato la mia risposta con una fonte molto migliore per alcuni documenti sull'argomento. – vrish88

2

Poiché la sessione è un Ruby CGI::Session e non un hash, l'eliminazione di chiamata cancellerà effettivamente la sessione. Elimina non ha parametri: questo è il mio messaggio "Numero errato di argomenti (1 o 0)" quando si tenta ciò che hyuan suggerisce.

Il modo generalmente accettato per cancellare una voce di sessione è con sessione [: foo] = nil come suggerisci. È lontano dall'ideale, ma affermazioni come session [: foo] .nil? si comporterà come previsto.

Vorrei davvero che si comportasse come un normale Hash ... ma non è così.

72

Sembra che la versione più semplice funzioni. Tutti i negozi (Cookie, File, ActiveRecord, ...) utilizzano AbstractStore::SessionHash come oggetto che contiene i dati, i diversi negozi forniscono solo i mezzi per caricare e salvare le istanze AbstractStore::SessionHash.

AbstractStore::SessionHash eredita da Hash, quindi questo rinvia al metodo Hash#delete:

session.delete(:key_to_delete) 
+0

Sembra che abbiano cambiato il comportamento. Questo non ha funzionato in Rails 2.3, per quanto mi ricordi. Grazie! – iGEL

+3

questa dovrebbe essere la risposta accettata – maprihoda