This method is a shortcut to all default validators and any custom validator classes ending in 'Validator'. Note that Rails default validators can be overridden inside specific classes by creating custom validator classes in their place such as PresenceValidator.
Examples of using the default rails validators:
validates :terms, acceptance: true
validates :password, confirmation: true
validates :username, exclusion: { in: %w(admin superuser) }
validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
validates :age, inclusion: { in: 0..9 }
validates :first_name, length: { maximum: 30 }
validates :age, numericality: true
validates :username, presence: true
validates :username, uniqueness: true
The power of the validates method comes when using custom
validators and default validators in one call for a given attribute.
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors.add attribute, (options[:message] || "is not an email") unless
value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
end
end
class Person
include ActiveModel::Validations
attr_accessor :name, :email
validates :name, presence: true, uniqueness: true, length: { maximum: 100 }
validates :email, presence: true, email: true
end
Validator classes may also exist within the class being validated allowing custom modules of validators to be included as needed.
class Film
include ActiveModel::Validations
class TitleValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors.add attribute, "must start with 'the'" unless value =~ /\Athe/i
end
end
validates :name, title: true
end
Additionally validator classes may be in another namespace and still used within any class.
validates :name, :'film/title' => true
The validators hash can also handle regular expressions, ranges, arrays and strings in shortcut form.
validates :email, format: /@/ validates :gender, inclusion: %w(male female) validates :password, length: 6..20
When using shortcut form, ranges and arrays are passed to your
validator's initializer as options[:in] while other types
including regular expressions and strings are passed as
options[:with].
There is also a list of options that could be used along with validators:
-
:on- Specifies when this validation is active. Runs in all validation contexts by default (nil), other options are:createand:update. -
:if- Specifies a method, proc or string to call to determine if the validation should occur (e.g.if: :allow_validation, orif: Proc.new { |user| user.signup_step > 2 }). The method, proc or string should return or evaluate to atrueorfalsevalue. -
:unless- Specifies a method, proc or string to call to determine if the validation should not occur (e.g.unless: :skip_validation, orunless: Proc.new { |user| user.signup_step <= 2 }). The method, proc or string should return or evaluate to atrueorfalsevalue. -
:allow_nil- Skip validation if the attribute isnil. -
:allow_blank- Skip validation if the attribute is blank. -
:strict- If the:strictoption is set to true will raise ActiveModel::StrictValidationFailed instead of adding the error.:strictoption can also be set to any other exception.
Example:
validates :password, presence: true, confirmation: true, if: :password_required? validates :token, uniqueness: true, strict: TokenGenerationException
Finally, the options :if, :unless,
:on, :allow_blank, :allow_nil,
:strict and :message can be given to one specific
validator, as a hash:
validates :password, presence: { if: :password_required?, message: 'is forgotten.' }, confirmation: true
Please login to continue.