2009-03-26 3 views

ответ

8

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

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

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

session.data[:foo] 

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

session.data.delete :foo 

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

+0

Это портативный accross все сессии магазинах? Он выглядит немного интимным, поскольку атрибут данных не упоминается в документах. – RichH

+0

Я честно не знаю. Я обнаружил это с помощью отладчика и проверки переменной сеанса. Мне удалось найти небольшую поддержку для моего ответа, хотя http://tinyurl.com/cp7ntm, проверить последний метод, когда они назначают session_data = @ _session.data. Это самое лучшее, что я мог найти на нем. – vrish88

+0

Я только что обновил свой ответ с гораздо лучшим источником для некоторых документов по этому вопросу. – vrish88

2

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

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

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

72

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

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

session.delete(:key_to_delete) 
+0

Похоже, они изменили поведение. Насколько я помню, это не работало в Rails 2.3. Благодаря! – iGEL

+3

Это должен быть принятый ответ – maprihoda

Смежные вопросы