2015-03-24 2 views
1

Оказывается, что в Rails 3.2.21, сохраняя упорядоченный хеш не может сохранить значение, которое приходит от одного NumberHelper,, специфических helper.number_with_delimiterRails 3.2, сохраняя сериализованную хэш не сохраняет 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, или я делаю что-то неправильно?

+0

происходит на 'Rails 4.2.0', а также; больше похоже на ошибку в рельсах. –

+0

Это, похоже, исправлено в Rails 4.2.3. –

ответ

1

Да, это ошибка Rails (ActiveSupport), которая в конечном итоге была исправлена ​​в Rails 4.2.1. Из записок 4.2.1 релиза:

Исправлена ​​проблема с следующим AS :: SafeBuffer где примитивно-подобные строки будут свалена как примитивы

При использовании helper.number_with_delimiter, полученный объект выглядит и ведет себя как String, но на самом деле это ActiveSupport::SafeBuffer.

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

При использовании:

serialize :stuff, Hash 

Это означает, что за кулисами Rails использует формат YAML, чтобы сохранить данные в базу данных. В SafeBuffer произошла ошибка, из-за которой SafeBuffers, например, "123", были ошибочно преобразованы в целые числа (то есть 123) вместо оставшихся строк при сохранении и загрузке в/из YAML.

Опять же, теперь это исправлено с Rails 4.2.1. Вы можете увидеть здесь: затруднительное

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

 Смежные вопросы

  • Нет связанных вопросов^_^