activemodel/lib/active_model/errors.rb
# Translates an error message in its default scope
# (<tt>activemodel.errors.messages</tt>).
#
# Error messages are first looked up in <tt>activemodel.errors.models.MODEL.attributes.ATTRIBUTE.MESSAGE</tt>,
# if it's not there, it's looked up in <tt>activemodel.errors.models.MODEL.MESSAGE</tt> and if
# that is not there also, it returns the translation of the default message
# (e.g. <tt>activemodel.errors.messages.MESSAGE</tt>). 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
# <tt>class Admin < User; end</tt> and you wanted the translation for
# the <tt>:blank</tt> error message for the <tt>title</tt> attribute,
# it looks for these translations:
#
# * <tt>activemodel.errors.models.admin.attributes.title.blank</tt>
# * <tt>activemodel.errors.models.admin.blank</tt>
# * <tt>activemodel.errors.models.user.attributes.title.blank</tt>
# * <tt>activemodel.errors.models.user.blank</tt>
# * any default you provided through the +options+ hash (in the <tt>activemodel.errors</tt> scope)
# * <tt>activemodel.errors.messages.blank</tt>
# * <tt>errors.attributes.title.blank</tt>
# * <tt>errors.messages.blank</tt>
Translates an error message in its default scope
(activemodel.errors.messages).

Error messages are first looked up in activemodel.errors.models.MODEL.attributes.ATTRIBUTE.MESSAGE,
if it's not there, it's looked up in activemodel.errors.models.MODEL.MESSAGE and if
that is not there also, it returns the translation of the default 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 title attribute,
it looks for these translations.


Translates an error message in its default scope ( activemodel . errors . messages ) . Error messages are first looked up in activemodel . errors . models . MODEL . attributes . ATTRIBUTE . MESSAGE if it ' s not there it ' s looked up in activemodel . errors . models . MODEL . MESSAGE and if that is not there also it returns the translation of the default 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 title attribute it looks for these translations .
def generate_message(attribute, type = :invalid, options = {})
      type = options.delete(:message) if options[:message].is_a?(Symbol)
      if @base.class.respond_to?(:i18n_scope)
        defaults = @base.class.lookup_ancestors.map do |klass|
          [ :"#{@base.class.i18n_scope}.errors.models.#{klass.model_name.i18n_key}.attributes.#{attribute}.#{type}",
            :"#{@base.class.i18n_scope}.errors.models.#{klass.model_name.i18n_key}.#{type}" ]
        end
      else
        defaults = []
      end
      defaults << options.delete(:message)
      defaults << :"#{@base.class.i18n_scope}.errors.messages.#{type}" if @base.class.respond_to?(:i18n_scope)
      defaults << :"errors.attributes.#{attribute}.#{type}"
      defaults << :"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.model_name.human,
        attribute: @base.class.human_attribute_name(attribute),
        value: value
      }.merge!(options)
      I18n.translate(key, options)
    end
def generate_message ( attribute , type = :invalid , options = { } ) type = options . delete ( :message ) if options [ :message ] . is_a? ( Symbol ) if @base . class . respond_to? ( :i18n_scope ) defaults = @base . class . lookup_ancestors . map do | klass | [ :" #{ @base . class . i18n_scope } .errors.models. #{ klass . model_name . i18n_key } .attributes. #{ attribute } . #{ type } " , :" #{ @base . class . i18n_scope } .errors.models. #{ klass . model_name . i18n_key } . #{ type } " ] end else defaults = [ ] end defaults << options . delete ( :message ) defaults << :" #{ @base . class . i18n_scope } .errors.messages. #{ type } " if @base . class . respond_to? ( :i18n_scope ) defaults << :" errors.attributes. #{ attribute } . #{ type } " defaults << :" 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 . model_name . human , attribute : @base . class . human_attribute_name ( attribute ) , value : value } . merge! ( options ) I18n . translate ( key , options ) end
Translates an error message in its default scope
(<tt>activemodel.errors.messages</tt>).
Translates an error message in its default scope ( <tt > activemodel . errors . messages< / tt > ) .
attribute
<not_specific>
type
<not_specific>
options
<not_specific>