W rubinach na szynach podczas wykonywania session[:foo] = nil
pozostawia wpis o nazwie :foo
w obiekcie sesji. Jak możesz pozbyć się tego pojedynczego wpisu z obiektu sesji?Jak usunąć pojedynczy wpis z sesji ruby na szynach?
Odpowiedz
W rzeczywistości istnieje sposób na usunięcie wartości z sesji. Tak jak RichH powiedział, że zmienną sesji jest instancja CGI :: Session. Po wpisaniu czegoś podobnego do session[:foo]
faktycznie wygląda ten symbol w zmiennej instancji @data
w obiekcie sesji. Ta zmienna danych jest hash.
EDYCJA: Istnieje zmienna instancji danych w klasie CGI :: Session. Jeśli przejdziesz do docs i spojrzysz na kod źródłowy dla metody []=
zobaczysz, że istnieje członek @data
.
Więc usunąć session[:foo]
wszystko co musisz zrobić, to dostęp że @data
zmienna od wewnątrz sesji
session.data[:foo]
Teraz, aby go usunąć:
session.data.delete :foo
Po wykonaniu tego nie powinno być więcej foo w zmiennej sesji.
Ponieważ sesja jest ruby CGI::Session, a nie hashem, wywołanie delete spowoduje usunięcie sesji. Delete nie przyjmuje parametrów - to jest mój, który otrzymujesz komunikat "wrong number of arguments (1 or 0)", gdy próbujesz sugestii hyuan.
Powszechnie akceptowanym sposobem usuwania wpisu sesji jest sesja [: foo] = zero jak sugerujesz. To dalekie od ideału, ale takie stwierdzenia jak sesja [: foo] .nil? będzie się zachowywać zgodnie z oczekiwaniami.
Naprawdę chciałbym, aby zachowywało się jak normalny hasz ... ale tak nie jest.
Wygląda na to, że najprostsza wersja działa. Wszystkie sklepy (Cookie, File, ActiveRecord, ...) używają AbstractStore::SessionHash
jako obiektu zawierającego dane, różne sklepy zapewniają tylko środki do ładowania i zapisywania instancji AbstractStore::SessionHash
.
AbstractStore::SessionHash
dziedziczy z Hash
, więc ta odracza do sposobu Hash#delete
:
session.delete(:key_to_delete)
Czy to przenośny accross wszystkich sklepach sesji? Wygląda trochę intymnie, ponieważ atrybut danych nie jest wymieniony w dokumentach. – RichH
Szczerze mówiąc, nie wiem. Odkryłem to, używając debuggera i sprawdzając zmienną sesji. Jednak udało mi się znaleźć trochę wsparcia dla mojej odpowiedzi, http://tinyurl.com/cp7ntm, sprawdź ostatnią metodę, w której przypisują session_data = @ _session.data. To było najbardziej, co mogłem znaleźć na tym – vrish88
Właśnie zaktualizowałem swoją odpowiedź znacznie lepszym źródłem dla jakiejś dokumentacji na ten temat. – vrish88