ruby-on-rails - Rails 3.2,保存序列化哈希不会保存 number_with_delimiter()

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

在 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/

相关文章:

javascript 断言未加载到我的 html.erb 页面中

ruby-on-rails - Rails Active 模型序列化器返回数组而不是 json

ruby-on-rails - 在 Ruby/Rails gem 中需要 Node.js 依赖项

ruby-on-rails - Ruby on Rails 作为设备

ruby-on-rails - rails 中 'respond_to' 的用例是什么?

activemodel - Rails Active Model 序列化程序未设置 root

ruby-on-rails - Rails 中的 ActiveModel::Serializer - JSON 结果中忽略的序列化程序方法

ruby-on-rails - 异步应用服务器与多个阻塞服务器

ruby-on-rails - Rails API 事件模型序列化器根节点不工作

ruby-on-rails - 序列化模型子项的 JSON 关联