Как OpenStruct хранится в сессии
У меня есть контроллер. В этом контроллере я получаю объект OpenStruct и хочу сохранить его в сеансе приложения. Следующий код работает нормально:
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two')
p session[:info]
сразу после этой строки печатает
#<OpenStruct first_field=1, second_field="two">
Но после этого я делаю перенаправление на другой контроллер, и когда я пишу p session[:info]
в этом контроллере я получаю
{"table"=>{"first_field"=>1, "second_field"=>"two"}}
Итак, почему я получаю это, и как я могу загрузить правильный экземпляр OpenStruct?
1 ответ
Сессия обычно состоит из хеша значений и идентификатора сеанса, обычно 32-символьной строки, для идентификации хеша. Каждый файл cookie, отправляемый в браузер клиента, содержит идентификатор сеанса. И наоборот: браузер будет отправлять его на сервер при каждом запросе клиента.
Вы должны либо сериализовать свои объекты перед сохранением их в сеансе.
session[:info] = OpenStruct.new(first_field: 1, second_field: 'two').to_yaml
и получить его, используя
YAML.load(session[:info])
из рельсовой документации
Не храните большие объекты в сеансе. Вместо этого вы должны сохранить их в базе данных и сохранить их идентификатор в сеансе. Это устранит проблемы с синхронизацией и не заполнит пространство хранения вашего сеанса (в зависимости от того, какое хранилище сеансов вы выбрали, см. Ниже). Это также будет хорошей идеей, если вы измените структуру объекта и старые версии его все еще находятся в файлах cookie некоторых пользователей. С серверными хранилищами сеансов вы можете очистить сеансы, но с клиентскими хранилищами это трудно смягчить.
или измените свой магазин сеансов из cookie_store
в cache_store
В вашем environment
менять
config.session_store :cookie_store
в
config.session_store :cache_store