我在尝试在表单中使用本地化内容时遇到了类似的问题。ActionView::Helpers::NumberHelper
使用内置方法本地化输出相对简单,但不支持解析本地化输入ActiveRecord
。
这是我的解决方案,请告诉我我是否做错了什么。在我看来,这太简单了,无法成为正确的解决方案。谢谢!:)
首先,让我们添加一个方法到String
.
class String
def to_delocalized_decimal
delimiter = I18n::t('number.format.delimiter')
separator = I18n::t('number.format.separator')
self.gsub(/[#{delimiter}#{separator}]/, delimiter => '', separator => '.')
end
end
然后让我们添加一个类方法ActiveRecord::Base
class ActiveRecord::Base
def self.attr_localized(*fields)
fields.each do |field|
define_method("#{field}=") do |value|
self[field] = value.is_a?(String) ? value.to_delocalized_decimal : value
end
end
end
end
最后,让我们声明哪些字段应该本地化输入。
class Article < ActiveRecord::Base
attr_localized :price
end
现在,在您的表单中,您可以输入“1.936,27”并且ActiveRecord
不会在无效数字上引发错误,因为它变成了 1936.27。