Как очистить одну запись из сеанса Ruby on Rails?
-
22-08-2019 - |
Вопрос
В рубине на рельсах при выполнении session[:foo] = nil
он оставляет запись с именем :foo
в объекте сеанса.Как можно избавиться от этой единственной записи из объекта сеанса?
Решение
На самом деле есть способ удалить значение из сеанса.Как сказал RichH, переменная сеанса является экземпляром CGI::Session.Когда введите что-то вроде session[:foo]
на самом деле он ищет этот символ в @data
переменная экземпляра в объекте сеанса.Эта переменная данных является хешем.
РЕДАКТИРОВАТЬ: В классе CGI::Session есть переменная экземпляра данных.Если вы пойдете в документы и посмотрите исходный код []=
метод, вы увидите, что существует @data
член.
Итак, чтобы удалить session[:foo]
все, что вам нужно сделать, это получить доступ к этому @data
переменная изнутри сеанса
session.data[:foo]
Теперь, чтобы удалить его:
session.data.delete :foo
Как только вы это сделаете, в вашей переменной сеанса больше не должно быть foo.
Другие советы
Похоже на самая простая версия работает.Все хранилища (Cookie, File, ActiveRecord,...) используют AbstractStore::SessionHash
В качестве объекта, содержащего данные, различные хранилища предоставляют только средства для загрузки и сохранения данных. AbstractStore::SessionHash
экземпляры.
AbstractStore::SessionHash
наследует от Hash
, так что это относится к Hash#delete
метод:
session.delete(:key_to_delete)
Поскольку сессия — это Ruby CGI::Сессия а не хэш, вызов удаления фактически удалит сеанс.Удалить не принимает никаких параметров - это мое сообщение о том, что вы получаете сообщение «неправильное количество аргументов (1 или 0)», когда пытаетесь выполнить то, что предлагает Хьюан.
Общепринятый способ очистки записи сеанса — использовать session[:foo] = nil, как вы предлагаете.Это далеко от идеала, но такие утверждения, как session[:foo].nil?будет вести себя так, как ожидалось.
Мне бы очень хотелось, чтобы он вел себя как обычный Хэш...но это не так.