Почему сериализатор сеанса cookie Rails 4.1 преобразует вложенные ключи сеанса из символов в строки?

В моем старом приложении используются вложенные ключи сеанса, например:

session[:nested] = {some_id: 123}

Это прекрасно работало в Rails версии 4.0 и старше, но в Rails 4.1 это не работает: вложенные сеансовые ключи десериализуются как строки, поэтому я больше не могу ссылаться на эти вложенные значения с помощью символа следующим образом:

session[:nested][:some_id]

Однако сеансовые ключи верхнего уровня по-прежнему работают нормально:

# First action that puts values into session.
def set_session_vars
  session[:some_id] = 321
  session[:nested] = {some_id: 123}
end

# Second action that loads values from session.
def set_session_vars
  root_id = session[:some_id] # => 321, works as expected.
  nested_id = session[:nested][:some_id] # => nil, THIS DOES NOT!
end

Я понимаю, что Rails 4.1 вносит довольно значительные изменения в способ сериализации сеанса — он больше не использует Marshal.dump, вместо этого он использует базовый сериализатор JSON, который не сериализует объекты как есть. Однако он должен нормально работать для базовых типов, таких как целые числа и строки, которые я использую.

Я пытался использовать "гибридный" сериализатор сеансов, но это тоже не работает:

Rails.application.config.action_dispatch.cookies_serializer = :hybrid

Вопрос: что вы можете порекомендовать, кроме "не использовать вложенные сеансовые ключи"?

Спасибо, Алекс.


person Alex Kovshovik    schedule 06.08.2014    source источник


Ответы (1)


Я столкнулся с той же проблемой. Я знаю, что это не тот ответ, который вам нужен, но он работает.

nested_id = session[:nested]['some_id'] # => 321

ИЗМЕНИТЬ

Ведь я поменял :cookie_store на :active_record_store в config\initializers\session_store.rb

Вам не нужно менять другой код.

nested_id = session[:nested][:some_id] # => 321

person mitsu    schedule 26.05.2015
comment
Спасибо @mitsu. Я уже нашел обходной путь для этой проблемы. - person Alex Kovshovik; 26.05.2015