module Seiel::I18nGoodies::ClassMethods

Public Instance Methods

enum(definitions, namespace: :enums, namespace_skip_models: true, default_kind: nil) click to toggle source

Decorate Rails' enum with i18n methods.

* `Model.plural_enums.i18n`: returns an array of arrays like `['Caption', 'string', 0]`
* `Model.plural_enums.for_select`: returns an array useful for an html select

@param [Hash] definitions Same as Rails' own @param [#to_s] namespace: useful for i18n scopes; default :enums @param [bool] namespace_skip_models: useful for i18n scopes; default true @param [#to_s] default_kind: useful for i18n scopes; default nil

Calls superclass method
# File lib/seiel/i18n_goodies.rb, line 86
def enum(definitions, namespace: :enums, namespace_skip_models: true, default_kind: nil)
  super(definitions)

  klass = self
  definitions.each do |name, _|
    meth = name.to_s.pluralize
    feature = 'i18n_extensions'
    with = "#{meth}_with_#{feature}"
    without = "#{meth}_without_#{feature}"
    klass.singleton_class.send(:define_method, with) {
      value = send(without).try :dup

      unless value.nil?
        value.extend Enums::ClassExtensions
        value._model = self
        value._enum = name
        value._namespace = namespace
        value._namespace_skip_models = namespace_skip_models
        value._default_kind = default_kind
        value
      end
    }

    # FIXME: buscar la manera de utilizar #prepend
    eigenclass = klass.singleton_class
    eigenclass.send(:alias_method, without, meth)
    eigenclass.send(:alias_method, meth, with)

    define_method(name) {
      value = super().try :dup

      unless value.nil?
        value.extend Enums::Extensions
        value._model = self
        value._enum = name
        value._namespace = namespace
        value._namespace_skip_models = namespace_skip_models
        value._default_kind = default_kind
        value
      end
    }
  end
end
i18n(key, *args, **kws) click to toggle source
# File lib/seiel/i18n_goodies.rb, line 44
def i18n(key, *args, **kws)
  if kws[:model]
    kws[:skip_models] = false
    kws[:skip_enums] = true
  end

  kws[:skip_models] = true unless kws.key?(:skip_models)
  skip_enums = kws.delete(:skip_enums)

  args.unshift :enums unless skip_enums

  data = {}
  data.merge! args.pop if args.last.is_a?(Hash)
  data[:scope] = i18n_scope(*args, **kws)

  I18n.t key,
    data
end
i18n_scope(*args) click to toggle source
Calls superclass method
# File lib/seiel/i18n_goodies.rb, line 28
def i18n_scope(*args)
  if args.empty?
    super
  else
    opts = args.extract_options!
    (
      [
        super(),
        args.shift,
        (opts[:skip_models] ? nil : :models),
        model_name.i18n_key
      ].compact + args.compact
    ).map(&:to_s)
  end
end
status_enum(definitions) click to toggle source

Adapts enums with i18n conventions for statuses

@param [Hash] definitions Same as Rails' own

# File lib/seiel/i18n_goodies.rb, line 68
def status_enum(definitions)
  enum definitions,
    namespace: :statuses,
    namespace_skip_models: false,
    default_kind: :captions
end