Method: ActiveModel::Error.generate_message

Defined in:
lib/active_model/error.rb

.generate_message(attribute, type, base, options) ⇒ Object

:nodoc:



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/active_model/error.rb', line 64

def self.generate_message(attribute, type, base, options) # :nodoc:
  type = options.delete(:message) if options[:message].is_a?(Symbol)
  value = (attribute != :base ? base.read_attribute_for_validation(attribute) : nil)

  options = {
    model: base.model_name.human,
    attribute: base.class.human_attribute_name(attribute, { base: base }),
    value: value,
    object: base
  }.merge!(options)

  if base.class.respond_to?(:i18n_scope)
    i18n_scope = base.class.i18n_scope.to_s
    attribute = attribute.to_s.remove(/\[\d+\]/)

    defaults = base.class.lookup_ancestors.flat_map do |klass|
      [ :"#{i18n_scope}.errors.models.#{klass.model_name.i18n_key}.attributes.#{attribute}.#{type}",
        :"#{i18n_scope}.errors.models.#{klass.model_name.i18n_key}.#{type}" ]
    end
    defaults << :"#{i18n_scope}.errors.messages.#{type}"

    catch(:exception) do
      translation = I18n.translate(defaults.first, **options.merge(default: defaults.drop(1), throw: true))
      return translation unless translation.nil?
    end unless options[:message]
  else
    defaults = []
  end

  defaults << :"errors.attributes.#{attribute}.#{type}"
  defaults << :"errors.messages.#{type}"

  key = defaults.shift
  defaults = options.delete(:message) if options[:message]
  options[:default] = defaults

  I18n.translate(key, **options)
end