为什么Rails 4.1 cookie会话序列化器将嵌套的会话密钥从符号转换为字符串?

时间:2014-08-06 02:07:44

标签: ruby-on-rails ruby ruby-on-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序列化器,它不会按原样序列化对象。但它应该适用于我使用的基本类型,如整数和字符串。

我尝试使用" hybrid"会话序列化程序,但这不起作用:

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

问题:除了"不使用嵌套会话密钥"

之外,您还可以推荐什么?

谢谢你, 亚历克斯。

1 个答案:

答案 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