在 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 (ActiveSupport) 错误,最终在 Rails 4.2.1 中修复。来自 4.2.1 发行说明:
Fixed a roundtrip problem with AS::SafeBuffer where primitive-like strings will be dumped as primitives
当您使用helper.number_with_delimiter
时,生成的对象看起来和行为都像一个字符串,但实际上它是一个ActiveSupport::SafeBuffer
。
helper.number_with_delimiter(123456).class # => ActiveSupport::SafeBuffer < String
当您使用时:
serialize :stuff, Hash
这意味着 Rails 在幕后使用 YAML 格式将数据保存到数据库。 SafeBuffer 中存在一个错误,导致在保存和加载 YAML 时,"123"
之类的 SafeBuffer 被错误地转换为整数(即 123
),而不是剩余的字符串。
同样,从 Rails 4.2.1 开始,这个问题已得到修复。您可以在此处查看修复:
https://github.com/rails/rails/commit/debe7aedda3665702d1f99a3ffb4a123a6c44e9c
关于ruby-on-rails - Rails 3.2,保存序列化哈希不会保存 number_with_delimiter(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29224421/