Как 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
Другие вопросы по тегам