【问题标题】:Rails 3.2, saving serialized hash will not save number_with_delimiter()Rails 3.2,保存序列化哈希不会保存 number_with_delimiter()
【发布时间】:2015-03-24 03:15:44
【问题描述】:

似乎在 Rails 3.2.21 中,保存序列化哈希无法保存来自一个特定 NumberHelper 的值,helper.number_with_delimiter

在 Rails 3.2 应用程序中,在模型 Foo 中我有:

serialize :stuff, Hash

在控制台中:

f = Foo.create
f.stuff = { a: "aaaa", b: 1111, c: helper.number_with_delimiter(123456) }
=> {:a=>"aaaa", :b=>1111, :c=>"123,456"} # so far so good
f.save!
f.stuff
=> {:a=>"aaaa", :b=>1111, :c=>123456} # c should be a STRING

它可以与helper.number_to_currency() 一起正常工作。

如果我设置c: String.new(helper.number_with_delimiter(123456)),它就可以工作。

这是 Rails 错误,还是我做错了什么?

【问题讨论】:

  • 也发生在Rails 4.2.0;看起来更像是一个 Rails 错误。
  • 这似乎已在 Rails 4.2.3 中修复。

标签: ruby-on-rails active-model-serializers


【解决方案1】:

是的,这是一个 Rails (ActiveSupport) 错误,最终在 Rails 4.2.1 中得到修复。来自 4.2.1 发行说明:

修复了 AS::SafeBuffer 的往返问题,其中原始字符串将作为原始字符串转储

当您使用helper.number_with_delimiter 时,生成的对象看起来和行为都像字符串,但实际上它是ActiveSupport::SafeBuffer

helper.number_with_delimiter(123456).class # => ActiveSupport::SafeBuffer < String

使用时:

serialize :stuff, Hash

这意味着 Rails 在幕后使用 YAML 格式将数据保存到数据库。 SafeBuffer 中存在一个错误,导致像 "123" 这样的 SafeBuffer 在保存和加载到 YAML 或从 YAML 加载时被错误地转换为整数(即​​ 123)而不是剩余的字符串。

同样,这个问题现在已从 Rails 4.2.1 开始修复。您可以在此处查看修复:

https://github.com/rails/rails/commit/debe7aedda3665702d1f99a3ffb4a123a6c44e9c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2018-05-16
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多