В ruby on rails при выполнении session[:foo] = nil
он оставляет запись с именем :foo
в объекте сеанса. Как вы можете избавиться от этой единственной записи от объекта сеанса?
Как вы удаляете одну запись из рубинового сеанса рельсов?
Ответ 1
На самом деле есть способ получить значение из сеанса. Как и RichH, переменная сеанса является экземпляром CGI:: Session. Когда вы вводите что-то вроде session[:foo]
, он фактически ищет этот символ в переменной экземпляра @data
в объекте сеанса. Эта переменная данных является хешем.
EDIT: В классе CGI:: Session есть переменная экземпляра данных. Если вы перейдете к docs и посмотрите исходный код метода []=
, вы увидите, что есть член @data
.
Итак, чтобы удалить session[:foo]
все, что вам нужно сделать, это доступ к этой переменной @data
изнутри сеанса
session.data[:foo]
Теперь, чтобы удалить его:
session.data.delete :foo
Как только вы сделаете это, в вашей переменной сеанса должно быть не больше foo.
Ответ 2
Похоже, что простейшая версия работает. Все магазины (Cookie, File, ActiveRecord,...) используют AbstractStore::SessionHash
как объект, содержащий данные, разные магазины предоставляют только средства для загрузки и сохранения экземпляров AbstractStore::SessionHash
.
AbstractStore::SessionHash
наследуется от Hash
, поэтому это отклоняется к методу Hash#delete
:
session.delete(:key_to_delete)
Ответ 3
Поскольку сеанс является Ruby CGI:: Session, а не хешем, вызов delete фактически удалит сеанс. Удалить не принимает параметров - это я, вы получаете сообщение "неправильное количество аргументов (1 или 0)", когда вы пытаетесь понять, что предлагает hyuan.
Общепринятым способом очистки записи сеанса является сеанс [: foo] = nil, как вы предлагаете. Это далеко не идеально, но такие утверждения, как session [: foo].nil? будет вести себя так, как ожидалось.
Мне очень хочется, чтобы он вел себя как обычный хэш... но это не так.