从3.2升级到Rails 4.0时,存储停止工作

时间:2016-07-15 18:51:16

标签: ruby-on-rails ruby json ruby-on-rails-4 ruby-on-rails-3.2

我正在将我的Rails应用程序从 v3.2升级到v4.0 。在我的User模型中,我有一个JSON编码存储:

store :settings, accessors: [
  :confirmed,
  :receive_marketing_emails,
  :receive_reply_emails
], coder: JSON

这可以按预期工作,序列化User.settings并提供访问者。

然而,当我转移到Rails 4.0时,商店停止工作。当我尝试查找任何用户时出现以下错误:

JSON::ParserError: 795: unexpected token at '---
:confirmed,
:receive_marketing_emails,
:receive_reply_emails
'

任何人都可以提供任何见解吗?

2 个答案:

答案 0 :(得分:0)

Rails Upgrade Guide

中有此声明
  

Rails 4.0已将ActiveModel :: Serializers :: JSON.include_root_in_json默认值更改为false。现在,Active Model Serializers和Active Record对象具有相同的默认行为。

我建议在访问User实例时,json字段无法反序列化,因为它不需要root,而序列化数据则有。

要恢复为Rails 3.2行为,请将其放在config/initializers/wrap_parameters.rb

ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = true
end

答案 1 :(得分:0)

this question's answer

  

早期(ActiveRecord 3.2.8)数据存储在数据库中是YAML格式,它使用“coder:JSON”,这在ActiveRecord 4.2.4中不是这样。

因此,即使您指定coder: JSON,数据也会被序列化为YAML,而不是JSON。奇怪。

要回答我自己的问题,在Rails 4.0中,我只需将coder: JSON更改为coder: YAML