Как вы очищаете одну запись от сессии ruby ​​на рельсах? - PullRequest
28 голосов
/ 26 марта 2009

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

Ответы [ 3 ]

78 голосов
/ 09 февраля 2011

Похоже, простейшая версия работает . Все хранилища (Cookie, File, ActiveRecord, ...) используют AbstractStore::SessionHash в качестве объекта, который содержит данные, различные хранилища предоставляют только средства для загрузки и сохранения экземпляров AbstractStore::SessionHash.

AbstractStore::SessionHash наследуется от Hash, поэтому это относится к методу Hash#delete:

session.delete(:key_to_delete)
8 голосов
/ 26 марта 2009

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

EDIT: В классе CGI :: Session есть переменная экземпляра данных. Если вы перейдете к документам и посмотрите на исходный код метода []=, вы увидите, что существует @data член.

Таким образом, чтобы удалить session[:foo], все, что вам нужно сделать, - это обратиться к этой переменной @data изнутри сессии

   session.data[:foo]

Теперь, чтобы удалить его:

   session.data.delete :foo

Как только вы сделаете это, в вашей переменной сеанса не должно быть больше foo.

2 голосов
/ 26 марта 2009

Поскольку Session является Ruby CGI :: Session , а не Hash, вызов delete фактически удалит сессию. Удаление не принимает параметров - это мое сообщение "неправильное количество аргументов (1 или 0)", когда вы пытаетесь предложить то, что предлагает hyuan.

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

Мне бы очень хотелось, чтобы он вел себя как обычный хэш ... но это не так.

...