module Tolken::Translates

Public Instance Methods

translates(field_name, options = {}) click to toggle source
# File lib/tolken/translates.rb, line 5
def translates(field_name, options = {})
  define_getter(field_name)
  serialize(field_name, HashSerializer)

  if options[:presence]
    validation_names = I18n.available_locales.map { |locale| "#{field_name}_#{locale}" }
    readers = store_accessor(field_name, *validation_names)
    private(*(readers + readers.map { |name| "#{name}=" }))

    define_validator(field_name) if options[:presence]
  end
end

Private Instance Methods

define_getter(field_name) click to toggle source
# File lib/tolken/translates.rb, line 20
def define_getter(field_name)
  define_method(field_name) do |locale = nil|
    return self[field_name] unless locale

    begin
      self[field_name].fetch(locale.to_s)
    rescue IndexError
      raise ArgumentError, "Invalid locale #{locale}" unless I18n.available_locales.include?(locale.to_sym)

      nil
    end
  end
end
define_validator(field) click to toggle source
# File lib/tolken/translates.rb, line 34
def define_validator(field)
  validate(
    proc do
      invalid = I18n.available_locales.map do |locale|
        errors.add(:"#{field}_#{locale}", :blank) if self[field][locale.to_s].blank?
      end

      errors.add(field) if invalid.compact.present?
    end
  )
end