Module: ActiveRecord::Validations

Defined in:
lib/active_record/validations.rb

Overview

Active Records implement validation by overwriting Base#validate (or the variations, validate_on_create and validate_on_update). Each of these methods can inspect the state of the object, which usually means ensuring that a number of attributes have a certain value (such as not empty, within a given range, matching a certain regular expression).

Example:

class Person < ActiveRecord::Base
  protected
    def validate
      errors.add_on_empty %w( first_name last_name )
      errors.add("phone_number", "has invalid format") unless phone_number =~ /[0-9]*/
    end

    def validate_on_create # is only run the first time a new object is saved
      unless valid_discount?(membership_discount)
        errors.add("membership_discount", "has expired")
      end
    end

    def validate_on_update
      errors.add_to_base("No changes have occured") if unchanged_attributes?
    end
end

person = Person.new("first_name" => "David", "phone_number" => "what?")
person.save                         # => false (and doesn't do the save)
person.errors.empty?                # => false
person.count                        # => 2
person.errors.on "last_name"        # => "can't be empty"
person.errors.on "phone_number"     # => "has invalid format"
person.each_full { |msg| puts msg } # => "Last name can't be empty\n" +
                                         "Phone number has invalid format"

person.attributes = { "last_name" => "Heinemeier", "phone_number" => "555-555" }
person.save # => true (and person is now saved in the database)

An Errors object is automatically created for every Active Record.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.append_features(base) ⇒ Object

:nodoc:



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/active_record/validations.rb', line 40

def self.append_features(base) # :nodoc:
  super

  base.class_eval do
    alias_method :save_without_validation, :save
    alias_method :save, :save_with_validation

    alias_method :update_attribute_without_validation_skipping, :update_attribute
    alias_method :update_attribute, :update_attribute_with_validation_skipping
  end
end

Instance Method Details

#errorsObject

Returns the Errors object that holds all information about attribute error messages.



75
76
77
78
# File 'lib/active_record/validations.rb', line 75

def errors
  @errors = Errors.new(self) if @errors.nil?
  @errors
end

#save_with_validation(perform_validation = true) ⇒ Object

The validation process on save can be skipped by passing false. The regular Base#save method is replaced with this when the validations module is mixed in, which it is by default.



54
55
56
# File 'lib/active_record/validations.rb', line 54

def save_with_validation(perform_validation = true)
  if perform_validation && valid? || !perform_validation then save_without_validation else false end
end

#update_attribute_with_validation_skipping(name, value) ⇒ Object

Updates a single attribute and saves the record without going through the normal validation procedure. This is especially useful for boolean flags on existing records. The regular update_attribute method in Base is replaced with this when the validations module is mixed in, which it is by default.



61
62
63
64
# File 'lib/active_record/validations.rb', line 61

def update_attribute_with_validation_skipping(name, value)
  @attributes[name] = value
  save(false)
end

#valid?Boolean

Runs validate and validate_on_create or validate_on_update and returns true if no errors were added otherwise false.

Returns:

  • (Boolean)


67
68
69
70
71
72
# File 'lib/active_record/validations.rb', line 67

def valid?
  errors.clear
  validate
  if new_record? then validate_on_create else validate_on_update end
  errors.empty?
end