Module: Seiel::I18nGoodies::ClassMethods

Defined in:
lib/seiel/i18n_goodies.rb

Instance Method Summary collapse

Instance Method Details

#enum(definitions, namespace: :enums, namespace_skip_models: true, default_kind: nil) ⇒ Object

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

Parameters:

  • definitions (Hash)

    Same as Rails’ own

  • namespace: (#to_s) (defaults to: :enums)

    useful for i18n scopes; default :enums

  • namespace_skip_models: (bool) (defaults to: true)

    useful for i18n scopes; default true

  • default_kind: (#to_s) (defaults to: nil)

    useful for i18n scopes; default nil



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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) ⇒ Object

Adapts enums with i18n conventions for statuses

Parameters:

  • definitions (Hash)

    Same as Rails’ own



68
69
70
71
72
73
# File 'lib/seiel/i18n_goodies.rb', line 68

def status_enum(definitions)
  enum definitions,
    namespace: :statuses,
    namespace_skip_models: false,
    default_kind: :captions
end