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?

È stato utile?

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ì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top