Please do have a look at ActiveRecord::Validations::ClassMethods for a higher level of validations.
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 occurred") 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.errors.count # => 2 person.errors.on "last_name" # => "can't be empty" person.errors.on "phone_number" # => "has invalid format" person.errors.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.
Returns the Errors object that holds all information about attribute error messages.
# File lib/active_record/validations.rb, line 1129 def errors @errors ||= Errors.new(self) end
Performs the opposite of valid?. Returns true if errors were added, false otherwise.
# File lib/active_record/validations.rb, line 1124 def invalid? !valid? end
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.
# File lib/active_record/validations.rb, line 1087 def save_with_validation(perform_validation = true) if perform_validation && valid? || !perform_validation save_without_validation else false end end
Attempts to save the record just like Base#save but will raise a RecordInvalid exception instead of returning false if the record is not valid.
# File lib/active_record/validations.rb, line 1097 def save_with_validation! if valid? save_without_validation! else raise RecordInvalid.new(self) end end
Runs validate and validate_on_create or validate_on_update and returns true if no errors were added otherwise false.
# File lib/active_record/validations.rb, line 1106 def valid? errors.clear run_callbacks(:validate) validate if new_record? run_callbacks(:validate_on_create) validate_on_create else run_callbacks(:validate_on_update) validate_on_update end errors.empty? end
Overwrite this method for validation checks on all saves and use Errors.add(field, msg) for invalid attributes.
# File lib/active_record/validations.rb, line 1135 def validate end
Generated with the Darkfish Rdoc Generator 2.