我的旧应用程序碰巧使用这样的嵌套会话密钥:
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序列化器,它不会按原样序列化对象。但它应该适用于我使用的基本类型,如整数和字符串。
我尝试使用" hybrid"会话序列化程序,但这不起作用:
Rails.application.config.action_dispatch.cookies_serializer = :hybrid
问题:除了"不使用嵌套会话密钥"
之外,您还可以推荐什么?谢谢你, 亚历克斯。
答案 0 :(得分: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