Method: ActiveObject::Validations::ClassMethods#validates_confirmation_of

Defined in:
lib/active_object/validations.rb

#validates_confirmation_of(*attr_names) ⇒ Object

Encapsulates the pattern of wanting to validate a password or email address field with a confirmation. Example:

Model:
  class Person < ActiveObject::Base
    validates_confirmation_of :user_name, :password
    validates_confirmation_of :email_address, :message => "should match confirmation"
  end

View:
  <%= password_field "person", "password" %>
  <%= password_field "person", "password_confirmation" %>

The added password_confirmation attribute is virtual; it exists only as an in-memory attribute for validating the password. To achieve this, the validation adds accessors to the model for the confirmation attribute. NOTE: This check is performed only if password_confirmation is not nil, and by default only on save. To require confirmation, make sure to add a presence check for the confirmation attribute:

validates_presence_of :password_confirmation, :if => :password_changed?

Configuration options:

  • :message - A custom error message (default is: “doesn’t match confirmation”).

  • :on - Specifies when this validation is active (default is :save, other options :create, :update).

  • :if - Specifies a method, proc or string to call to determine if the validation should occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The method, proc or string should return or evaluate to a true or false value.

  • :unless - Specifies a method, proc or string to call to determine if the validation should not occur (e.g. :unless => :skip_validation, or :unless => Proc.new { |user| user.signup_step <= 2 }). The method, proc or string should return or evaluate to a true or false value.



317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/active_object/validations.rb', line 317

def validates_confirmation_of(*attr_names)
  configuration = { :on => :save }
  configuration.update(attr_names.extract_options!)

  attr_accessor(*(attr_names.map { |n| "#{n}_confirmation" }))

  validates_each(attr_names, configuration) do |record, attr_name, value|
    unless record.send("#{attr_name}_confirmation").nil? or value == record.send("#{attr_name}_confirmation")
      record.errors.add(attr_name, :default => configuration[:message])
    end
  end
end