foodcoops/foodsoft

View on GitHub
app/models/concerns/localize_input.rb

Summary

Maintainability
A
25 mins
Test Coverage
module LocalizeInput
  extend ActiveSupport::Concern

  def self.parse(input)
    return input unless input.is_a? String

    Rails.logger.debug { "Input: #{input.inspect}" }
    separator = I18n.t('separator', scope: 'number.format')
    delimiter = I18n.t('delimiter', scope: 'number.format')
    input.gsub!(delimiter, '') if input.match(/\d+#{Regexp.escape(delimiter)}+\d+#{Regexp.escape(separator)}+\d+/) # Remove delimiter
    input.gsub!(separator, '.') # Replace separator with db compatible character
    input
  rescue StandardError
    Rails.logger.warn "Can't localize input: #{input}"
    input
  end

  class_methods do
    def localize_input_of(*attr_names)
      attr_names.flatten.each do |attr|
        define_method "#{attr}=" do |input|
          self[attr] = LocalizeInput.parse(input)
        end
      end
    end
  end
end