generate_message(attribute, type = :invalid, options = {})
public
Translates an error message in its default scope
(activemodel.errors.messages).
Error messages are first looked up in
models.MODEL.attributes.ATTRIBUTE.MESSAGE, if it’s not
there, it’s looked up in models.MODEL.MESSAGE and if that is
not there also, it returns the translation of the default message (e.g.
activemodel.errors.messages.MESSAGE). The translated model name,
translated attribute name and the value are available for interpolation.
When using inheritance in your models, it will check all the inherited
models too, but only if the model itself hasn’t been found. Say you
have class Admin < User; end and
you wanted the translation for the :blank error message
for the titleattribute, it looks for these translations:
<ol>
<li>activemodel.errors.models.admin.attributes.title.blank</li>
<li>activemodel.errors.models.admin.blank</li>
<li>activemodel.errors.models.user.attributes.title.blank</li>
<li>activemodel.errors.models.user.blank</li>
<li>any default you provided through the options hash (in
the activemodel.errors scope)</li>
<li>activemodel.errors.messages.blank</li>
<li>errors.attributes.title.blank</li>
<li>errors.messages.blank</li> </ol>
# File activemodel/lib/active_model/errors.rb, line 281
def generate_message(attribute, type = :invalid, options = {})
type = options.delete(:message) if options[:message].is_a?(Symbol)
if options[:default]
ActiveSupport::Deprecation.warn \
"Giving :default as validation option to errors.add has been deprecated.\n" +
"Please use :message instead."
options[:message] = options.delete(:default)
end
defaults = @base.class.lookup_ancestors.map do |klass|
[ "#{@base.class.i18n_scope}.errors.models.#{klass.model_name.underscore}.attributes.#{attribute}.#{type}""#{@base.class.i18n_scope}.errors.models.#{klass.model_name.underscore}.attributes.#{attribute}.#{type}",
"#{@base.class.i18n_scope}.errors.models.#{klass.model_name.underscore}.#{type}""#{@base.class.i18n_scope}.errors.models.#{klass.model_name.underscore}.#{type}" ]
end
defaults << options.delete(:message)
defaults << "#{@base.class.i18n_scope}.errors.messages.#{type}""#{@base.class.i18n_scope}.errors.messages.#{type}"
defaults << "errors.attributes.#{attribute}.#{type}""errors.attributes.#{attribute}.#{type}"
defaults << "errors.messages.#{type}""errors.messages.#{type}"
defaults.compact!
defaults.flatten!
key = defaults.shift
value = (attribute != :base ? @base.send(:read_attribute_for_validation, attribute) : nil)
options = {
:default => defaults,
:model => @base.class.model_name.human,
:attribute => @base.class.human_attribute_name(attribute),
:value => value
}.merge(options)
I18n.translate(key, options)
end