2009-03-26 9 views

Odpowiedz

8

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.

+0

Czy to przenośny accross wszystkich sklepach sesji? Wygląda trochę intymnie, ponieważ atrybut danych nie jest wymieniony w dokumentach. – RichH

+0

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

+0

Właśnie zaktualizowałem swoją odpowiedź znacznie lepszym źródłem dla jakiejś dokumentacji na ten temat. – vrish88

2

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.

72

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) 
+0

Wygląda na to, że zmienili to zachowanie. To nie działało w Railsach 2.3, o ile pamiętam. Dzięki! – iGEL

+3

to powinna być zaakceptowana odpowiedź – maprihoda