In ruby on rails quando si esegue session[:foo] = nil
lascia una voce denominata :foo
nell'oggetto di sessione. Come puoi sbarazzarti di quella singola voce dall'oggetto di sessione?Come si cancella una singola voce da una sessione di ruby on rails?
risposta
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.
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ì.
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)
È che attraversavano portatile tutti i negozi di sessione? Sembra un po 'intimo in quanto l'attributo dei dati non è menzionato nei documenti. – RichH
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
Ho appena aggiornato la mia risposta con una fonte molto migliore per alcuni documenti sull'argomento. – vrish88