Как очистить / уничтожить сессию в рельсах?


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 , который сам вызывает clear, а также некоторые другие вещи.


У кого-нибудь есть мысли о достоинствах этого метода по сравнению с тем, который рекомендован Гдеглином?
Питер Берг

3
Это можно использовать, если вы хотите сохранить другие параметры, но удалить одну конкретную пару значений ключа.
Lavixu

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

4
Документация Rails в разделе 5.1 Доступ к сеансу рекомендует использовать reset_session, если вы хотите удалить вставленные в сценарий пары ключ / значение (например, что-то, вставленное из контроллера) и сгенерировать новый сеанс. Если вы хотите сбросить только те пары ключ / значение, которые вы установили, установите для этих ключей значение nil.
sargas

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

6

удалить сеанс пользователя

session.delete(:user_id)

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

2
@Arthur Это неправда. Но вы удалите только ключ: 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оба работают, и, возможно, делают то же самое?
barlop
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.