Come si fa a cancellare una singola voce da un rubino sulla sessione di rotaie?
-
22-08-2019 - |
Domanda
In Ruby on Rails quando si fa session[:foo] = nil
lascia una voce denominata :foo
nell'oggetto sessione. Come si può sbarazzarsi di quella singola voce dall'oggetto sessione?
Soluzione
In realtà c'è un modo per ottenere eliminare un valore dalla sessione. Come RichH ha detto che la variabile di sessione è un'istanza CGI :: Session. Quando inserire qualcosa come session[:foo]
è in realtà guardando quel simbolo in una variabile di istanza @data
nell'oggetto sessione. Quella variabile di dati è un hash.
Modifica C'è una variabile di istanza di dati nella classe CGI :: Session. Se si va al docs guarda il codice sorgente per il metodo []=
vedrete 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 eliminarlo:
session.data.delete :foo
Una volta fatto questo il non ci dovrebbero essere più pippo nella variabile di sessione.
Altri suggerimenti
Sembra che il versione più semplice funziona . Tutti i negozi (Cookie, file, ActiveRecord, ...) utilizzano AbstractStore::SessionHash
come l'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)
Mentre la sessione è un rubino CGI :: Session e non un hash, chiamando eliminare effettivamente eliminare la sessione. Eliminare non accetta parametri -. Questo è il mio che stai ricevendo il "numero errato di argomenti (1 o 0)" quando si tenta ciò hyuan suggerisce
Il modo generalmente accettato per cancellare una voce di sessione è con session [: foo] = nil come lei suggerisce. E 'tutt'altro che ideale, ma affermazioni come session [: pippo] .nil? si comporterà come previsto.
davvero vorrei che si comportava come un Hash normale ... ma non è così.