Methods
D
F
G
N
V
Attributes
[RW] attribute
[RW] base
[RW] message
[RW] options
[RW] to_s
[RW] type
Class Public methods
new(base, attribute, type = nil, options = {})
# File activerecord/lib/active_record/validations.rb, line 21
def initialize(base, attribute, type = nil, options = {})
  self.base      = base
  self.attribute = attribute
  self.type      = type || :invalid
  self.options   = options
  self.message   = options.delete(:message) || self.type
end
Instance Public methods
full_message()
# File activerecord/lib/active_record/validations.rb, line 35
def full_message
  attribute.to_s == 'base' ? message : generate_full_message(default_options)
end
value()
# File activerecord/lib/active_record/validations.rb, line 41
def value
  @base.respond_to?(attribute) ? @base.send(attribute) : nil
end
Instance Protected methods
default_options()

Return user options with default options.

# File activerecord/lib/active_record/validations.rb, line 121
def default_options
  options.reverse_merge :scope => [:activerecord, :errors],
                        :model => @base.class.human_name,
                        :attribute => @base.class.human_attribute_name(attribute.to_s),
                        :value => value
end
generate_full_message(options = {})

Wraps an error message into a #full_message format.

The default #full_message format for any locale is "%{attribute} %{message}". One can specify locale specific default #full_message format by storing it as a translation for the key :"activerecord.errors.full_messages.format".

Additionally one can specify a validation specific error message format by storing a translation for :"activerecord.errors.full_messages.[message_key]". E.g. the #full_message format for any validation that uses :blank as a message key (such as validates_presence_of) can be stored to :"activerecord.errors.full_messages.blank".

Because the message key used by a validation can be overwritten on the validates_*class macro level one can customize the #full_message format for any particular validation:

# app/models/article.rb
class Article < ActiveRecord::Base
  validates_presence_of :title, :message => :"title.blank"
end
# config/locales/en.yml
en:
  activerecord:
    errors:
      full_messages:
        title:
          blank: This title is screwed!
# File activerecord/lib/active_record/validations.rb, line 108
def generate_full_message(options = {})
  keys = [
    :"full_messages.#{@message}",
    :'full_messages.format',
    '%{attribute} %{message}'
  ]
  options.merge!(:default => keys, :message => self.message)
  I18n.translate(keys.shift, options)
end
generate_message(options = {})

Translates an error message in it's default scope ( activerecord.errrors.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.MESSAGEand if that is not there it returns the translation of the default message (e.g. activerecord.errors.messages.MESSAGE). The translated model name, translated attribute name and the value are available for interpolation.

When using inheritence 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; endand you wanted the translation for the :blankerror messagefor the title attribute, it looks for these translations:

<ol> <li> activerecord.errors.models.admin.attributes.title.blank</li> <li> activerecord.errors.models.admin.blank</li> <li> activerecord.errors.models.user.attributes.title.blank</li> <li> activerecord.errors.models.user.blank</li> <li> activerecord.errors.messages.blank</li> <li>any default you provided through the optionshash (in the activerecord.errors scope)</li> </ol>

# File activerecord/lib/active_record/validations.rb, line 65
def generate_message(options = {})
  keys = @base.class.self_and_descendants_from_active_record.map do |klass|
    [ :"models.#{klass.name.underscore}.attributes.#{attribute}.#{@message}",
      :"models.#{klass.name.underscore}.#{@message}" ]
  end.flatten
  keys << options.delete(:default)
  keys << :"messages.#{@message}"
  keys << @message if @message.is_a?(String)
  keys << @type unless @type == @message
  keys.compact!
  options.merge!(:default => keys)
  I18n.translate(keys.shift, options)
end