У меня была похожая проблема при попытке использовать локализованный контент внутри форм. Локализация вывода относительно проста с использованием 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.