Подтвердить что ты не робот

Как вы удаляете одну запись из рубинового сеанса рельсов?

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

4b9b3361

Ответ 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? будет вести себя так, как ожидалось.

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