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

StackOverflow https://stackoverflow.com/questions/684457

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

РЕДАКТИРОВАТЬ: В классе CGI::Session есть переменная экземпляра данных.Если вы пойдете в документы и посмотрите исходный код []= метод, вы увидите, что существует @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::Сессия а не хэш, вызов удаления фактически удалит сеанс.Удалить не принимает никаких параметров - это мое сообщение о том, что вы получаете сообщение «неправильное количество аргументов (1 или 0)», когда пытаетесь выполнить то, что предлагает Хьюан.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top