Wie löschen Sie einen einzelnen Eintrag aus einer Ruby on Rails-Session?
-
22-08-2019 - |
Frage
In Ruby on Rails, wenn session[:foo] = nil
tut es läßt einen Eintrag :foo
im Sitzungsobjekt genannt. Wie können Sie diesen einzelnen Eintrag aus dem Session-Objekt loszuwerden?
Lösung
Eigentlich ist es eine Möglichkeit zu bekommen einen Wert aus der Sitzung löschen. Wie RichH sagte die Sitzungsvariable eine CGI :: Session-Instanz ist. Wenn so etwas session[:foo]
geben Sie suchen tatsächlich, dass das Symbol in einer @data
Instanzvariable in dem Session-Objekt auf. Das Datenvariable ist ein Hash.
EDIT: Es gibt eine Dateninstanz-Variable in der CGI :: Session-Klasse. Wenn Sie gehen auf die docs Blick auf den Quellcode für die []=
Methode, die Sie werden sehen, dass es ein @data
Mitglied.
So löschen session[:foo]
alles, was Sie tun müssen, ist, den Zugang, die variable @data
aus dem Inneren der Sitzung
session.data[:foo]
Jetzt löschen:
session.data.delete :foo
Wenn Sie dies tun, das sollte es nicht mehr foo in Ihrer Sitzung variabel sein.
Andere Tipps
Es sieht aus wie die einfachste Version funktioniert . Alle Geschäfte (Cookie, Datei, Active, ...) verwenden AbstractStore::SessionHash
als das Objekt, das die Daten enthält, die verschiedenen Geschäfte bieten die Möglichkeit, nur zu laden und die AbstractStore::SessionHash
Instanzen zu speichern.
AbstractStore::SessionHash
erbt von Hash
, so dass dieser aufschiebt zur Hash#delete
Methode:
session.delete(:key_to_delete)
Als Session ist ein Ruby CGI :: Session und kein Hash, löschen Aufruf wird Sitzung tatsächlich löschen. Löschen übernimmt keine Parameter -. Das ist mein, Sie bekommen die „falsche Anzahl von Argumenten (1 oder 0)“ angezeigt, wenn Sie versuchen, was hyuan schlägt
Die allgemein akzeptierte Art und Weise eine Sitzung Eingabe zu löschen ist mit session [: foo] = nil, wie Sie vorschlagen. Es ist bei weitem nicht ideal, aber Aussagen wie session [: foo] .nil? verhält sich wie erwartet.
Ich wünschte, es wirklich wie ein normaler Hash artig ... aber es funktioniert nicht.