validates_with
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 default nil. You can pass a symbol or an array of symbols. (e.g. on: :create or on: :custom_validation_context or on: [: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, 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.
-
:strict - Specifies whether validation should be strict. See ActiveModel::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