Ruby on rails Rails 3.2,保存序列化哈希不会保存带有分隔符()的数字

Ruby on rails Rails 3.2,保存序列化哈希不会保存带有分隔符()的数字,ruby-on-rails,active-model-serializers,Ruby On Rails,Active Model Serializers,在Rails 3.2.21中,保存序列化散列可能无法保存来自一个指定的NumberHelper的值,helper.number\u和_分隔符 在Rails 3.2应用程序中,在model Foo中,我有: serialize :stuff, Hash 在控制台中: f = Foo.create f.stuff = { a: "aaaa", b: 1111, c: helper.number_with_delimiter(123456) } => {:a=>"aaaa", :b=&g

在Rails 3.2.21中,保存序列化散列可能无法保存来自一个指定的NumberHelper的值,
helper.number\u和_分隔符

在Rails 3.2应用程序中,在model 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\u to\u currency()一起正常工作。

如果我设置
c:String.new(helper.number带有分隔符(123456))
,它就会工作

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

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

修复了AS::SafeBuffer的往返问题,类似于原语的字符串将作为原语转储

使用带有分隔符的
helper.number\u时,结果对象的外观和行为类似于字符串,但实际上它是一个
ActiveSupport::SafeBuffer

helper.number_with_delimiter(123456).class # => ActiveSupport::SafeBuffer < String
这意味着后台Rails使用YAML格式将数据保存到数据库中。SafeBuffer中存在一个错误,导致像
“123”
这样的SafeBuffer在保存和从YAML加载时被错误地转换为整数(即
123
),而不是剩余的字符串

同样,从Rails 4.2.1开始,这一点现在已经固定。您可以在此处看到修复:


同样发生在Rails 4.2.0上;看起来更像是rails的bug。这似乎在rails 4.2.3中得到了修复。
serialize :stuff, Hash