Как очистить одну запись из сеанса ruby on rails?

в ruby on rails при выполнении session[:foo] = nil Он оставляет запись с именем :foo в объекте Session. Как вы можете избавиться от этой единственной записи из объекта сеанса?

3 ответов


на самом деле есть способ, чтобы удалить значение из сессии. Как RichH сказала переменной сеанса к CGI::экземпляр сессии. Когда введите что-то вроде session[:foo] на самом деле он ищет этот символ в @data переменная экземпляра в объекте сеанса. Эта переменная данных является хэшем.

EDIT: в классе CGI::Session существует переменная экземпляра данных. Если вы идете в docs и посмотрите на исходный код []= способ вы смотрите, что есть @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:: Session и не хэш, вызов delete фактически удалит сеанс. Delete не принимает никаких параметров - это мое сообщение "неправильное количество аргументов (1 или 0)", когда вы пытаетесь сделать то, что предлагает хюан.

общепринятым способом очистки записи сеанса является сеанс [: foo] = nil, как вы предлагаете. Это далеко не идеально, но такие утверждения, как session[:foo].шь? будет вести себя так, как ожидалось.

Я очень этого хочу вел себя как нормальный хэш ... но это не так.--3-->