【问题标题】:Store stops working when upgrading to Rails 4.0 from 3.2从 3.2 升级到 Rails 4.0 时商店停止工作
【发布时间】:2016-07-15 18:51:15
【问题描述】:

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

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

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

但是,当我迁移到 Rails 4.0 时,Store 停止工作。当我尝试查找任何用户时出现以下错误:

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

谁能提供任何见解?

【问题讨论】:

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


    【解决方案1】:

    Rails Upgrade Guide中有这样的说法:

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

    我建议当您访问User 实例时,json 字段不能被反序列化,因为它不需要根,而序列化数据有它。

    要恢复到 Rails 3.2 的行为,请将其放入您的 config/initializers/wrap_parameters.rb

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

    【讨论】:

    • 嗨,Nic 感谢您的回复!从 3.2 开始,我们实际上已经将 include_root_in_json 设置为 false,所以序列化的数据永远不会有根,对吧?
    • 在这种情况下,我的建议可能不相关。不过,要确定根是否到位,您应该检查数据库中的原始数据。
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多