Як спорожнити / знищити сеанс у рейках?


133

Я не можу знайти його ніде ... Як видалити / знищити / скинути / порожній / очистити сеанс користувача в Rails? Не лише одна цінність, а вся справа ..

Відповіді:


203

Для очищення всього використовуйте метод reset_session в контролері.

reset_session

Ось документація щодо цього методу: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

Скидає сеанс, очищаючи всі об'єкти, що зберігаються в ньому, та ініціалізує новий об’єкт сеансу.

Удачі!


1
Для сесій на базі даних (які ви, ймовірно, повинні використовувати) ви можете закінчити через запит: guides.rubyonrails.org/security.html#session-expiry
m33lky

44

сесія в рейках - це хеш-об'єкт. Отже, будь-яка функція для очищення хеша буде працювати з сеансами.

session.clear

або якщо певні ключі потрібно знищити:

session.delete(key)

Випробуваний на рейках 3.2

додано

Люди, про які згадували, session={}- це погана ідея. Що стосується session.clearкоментарів Лобаті - Схоже, вам, мабуть, краще використовувати reset_session [ніж session.clear], як це робить інша чистка поза межами того, що робить session.clear. Всередині reset_session викликає session.destroy , який сам називає зрозумілим, а також деякі інші речі.


Хто-небудь має думки щодо достоїнств цього методу проти рекомендованого Gdeglin?
Пітер Берг

3
Це можна використовувати, коли потрібно зберегти інші параметри, але видалити одну конкретну пару значень ключа.
Lavixu

1
Це взагалі не скине сеанс, він призначить локальну змінну. Ніколи не використовуйте цю техніку для скидання сеансу: session = {}
alexspeller

4
Документація Rails в розділі 5.1 Доступ до сеансу рекомендує використовувати reset_session, якщо ви хочете видалити пара вставлених скриптів ключів / значень (наприклад: Щось вставлено з контролера) та створити новий сеанс. Якщо ви хочете скинути лише встановлені вами пари / значення, встановіть ці клавіші на нуль.
саргаз

1
@barlop Схоже, вам, мабуть, краще користуватися reset_session, як це роблять деякі інші прибирання за межі того, що session.clearробить. Внутрішньо, reset_sessionдзвінкиsession.destroy , які самі дзвінки clear, а також деякі інші речі .
lobati

6

щоб видалити сеанс користувача

session.delete(:user_id)

Обережно, ви можете видалити запис користувача з бази даних!
Артур

2
@ Артур Це неправда. Але ви видалите лише ключ: user_id із сеансу, а не весь сеанс
Andión

5

Щоб очистити лише певні параметри, ви можете використовувати:

[:param1, :param2, :param3].each { |k| session.delete(k) }

2

додайте цей код у свій ApplicationController

def reset_session
  @_request.reset_session
end

(Не знаю, чому ніхто вище просто не згадує цей код, як він вирішив мою проблему) http://apidock.com/rails/ActionController/RackDelegation/reset_session


Я вважаю, що @_request.reset_sessionі reset_sessionобидва працюють, і, можливо, роблять те саме?
барлоп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.