Jak opróżnić / zniszczyć sesję w railsach?

136

Nie mogę go nigdzie znaleźć ... Jak usunąć / zniszczyć / zresetować / opróżnić / wyczyścić sesję użytkownika w Railsach? Nie tylko jedna wartość, ale całość.

tybro0103
źródło

Odpowiedzi:

208

Aby wyczyścić całość, użyj metody reset_session w kontrolerze.

reset_session

Oto dokumentacja dotycząca tej metody: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

Resetuje sesję, usuwając wszystkie przechowywane w niej obiekty i inicjując nowy obiekt sesji.

Powodzenia!

Gdeglin
źródło
1
W przypadku sesji opartych na bazie danych (których prawdopodobnie powinieneś użyć) możesz wygasnąć za pomocą zapytania: guide.rubyonrails.org/security.html#session-expiry
m33lky
46

sesja w railsach jest obiektem haszującym. Dlatego każda funkcja dostępna do czyszczenia skrótu będzie działać z sesjami.

session.clear

lub jeśli trzeba zniszczyć określone klucze:

session.delete(key)

Testowany na szynach 3.2

dodany

Ludzie, o których wspominali, session={}to zły pomysł. Odnośnie session.clear, komentarze Lobati - Wygląda na to, że prawdopodobnie lepiej jest użyć reset_session [niż session.clear], ponieważ robi to inne czyszczenie poza tym, co robi session.clear. Wewnętrznie reset_session wywołuje session.destroy , co samo w sobie wywołuje clear, a także inne rzeczy.

Lavixu
źródło
Czy ktoś ma jakieś przemyślenia na temat zalet tej metody w porównaniu z tą zalecaną przez Gdeglina?
Peter Berg,
3
Można tego użyć, gdy chcesz zachować inne parametry, ale usunąć jedną określoną parę klucz-wartość.
Lavixu,
2
To w ogóle nie zresetuje sesji, przypisze lokalną zmienną. Nigdy nie używaj tej techniki do resetowania sesji: session = {}
alexspeller
4
Dokumentacja Railsów , w sekcji 5.1 Dostęp do sesji, zaleca użycie reset_session, jeśli chcesz usunąć wstawione skrypty pary klucz / wartość (np. Coś wstawionego z kontrolera) i wygenerować nową sesję. Jeśli chcesz zresetować tylko ustawione pary klucz / wartość, ustaw te klucze na zero.
sargas
1
@barlop Wygląda na to, że prawdopodobnie lepiej jest używać reset_session, ponieważ wykonuje inne czyszczenie poza tym, co session.clearrobi. Wewnętrznie reset_sessionpołączeniasession.destroy , które same wywołują clearrównież inne rzeczy .
lobati
7

aby usunąć sesję użytkownika

session.delete(:user_id)
vjnan369
źródło
Ostrożnie, możesz usunąć rekord użytkownika z bazy danych!
Arthur
3
@Arthur To nieprawda. Ale usuniesz tylko klucz: user_id z sesji, a nie z całej sesji
Andión
5

Aby wyczyścić tylko niektóre parametry, możesz użyć:

[:param1, :param2, :param3].each { |k| session.delete(k) }
vladCovaliov
źródło