instance method
validates_with
Ruby on Rails edge
Since v3.0.20Signature
validates_with(*args, &block)
Passes the record off to the class or classes specified and allows them to add errors based on more complex conditions.
class Person
include ActiveModel::Validations
validates_with MyValidator
end
class MyValidator < ActiveModel::Validator
def validate(record)
if some_complex_logic
record.errors.add :base, 'This record is invalid'
end
end
private
def some_complex_logic
# ...
end
end
You may also pass it multiple classes, like so:
class Person
include ActiveModel::Validations
validates_with MyValidator, MyOtherValidator, on: :create
end
There is no default error message for validates_with. You must manually add errors to the record’s errors collection in the validator class.
To implement the validate method, you must have a record parameter defined, which is the record to be validated.
Configuration options:
-
:on- Specifies the contexts where this validation is active. Runs in all validation contexts by defaultnil. You can pass a symbol or an array of symbols. (e.g.on: :createoron: :custom_validation_contextoron: [:create, :custom_validation_context]) -
: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. Multiple methods or procs can be passed as an array to check multiple conditions, all of which must pass for validation to occur (e.g.if: [:allow_validation, Proc.new { |user| user.signup_step > 2 }]) -
: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. Multiple methods or procs can be passed as an array to check multiple conditions, all of which must pass for validation not to occur (e.g.unless: [:skip_validation, Proc.new { |user| user.signup_step <= 2 }]) -
:strict- Specifies whether validation should be strict. SeeActiveModel::Validations#validates!for more information.
If you pass any additional configuration options, they will be passed to the class and available as options:
class Person
include ActiveModel::Validations
validates_with MyValidator, my_custom_key: 'my custom value'
end
class MyValidator < ActiveModel::Validator
def validate(record)
options[:my_custom_key] # => "my custom value"
end
end
Parameters
-
argsrest -
blockblock
Source
# File activemodel/lib/active_model/validations/with.rb, line 92
def validates_with(*args, &block)
options = args.extract_options!
options[:class] = self
args.each do |klass|
validator = klass.new(options.dup, &block)
if validator.respond_to?(:attributes) && !validator.attributes.empty?
validator.attributes.each do |attribute|
_validators[attribute.to_sym] << validator
end
else
_validators[nil] << validator
end
validate(validator, options)
end
end
Defined in activemodel/lib/active_model/validations/with.rb line 92
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveModel::Validations::ClassMethods