class Validator

Ruby on Rails edge

Since v3.0.20

Available in: v3.0.20 v3.1.12 v3.2.22.5 v4.0.13 v4.1.16 v4.2.11.3 v5.0.7.2 v5.1.7 v5.2.8.1 v6.0.6.1 v6.1.7.10 v7.0.10 v7.1.6 v7.2.4 v8.0.5.1 v8.1.4 edge

Active Model Validator

A simple base class that can be used along with ActiveModel::Validations::ClassMethods.validates_with

“‘ 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 “‘

Any class that inherits from ActiveModel::Validator must implement a method called validate which accepts a record.

“‘ class Person

include ActiveModel::Validations
validates_with MyValidator

end

class MyValidator < ActiveModel::Validator

def validate(record)
  record # => The person instance being validated
  options # => Any non-standard options passed to validates_with
end

end “‘

To cause a validation error, you must add to the record‘s errors directly from within the validators message.

“‘ class MyValidator < ActiveModel::Validator

def validate(record)
  record.errors.add :base, "This is some custom error message"
  record.errors.add :first_name, "This is some complex validation"
  # etc...
end

end “‘

To add behavior to the initialize method, use the following signature:

“‘ class MyValidator < ActiveModel::Validator

def initialize(options)
  super
  @my_custom_field = options[:field_name] || :first_name
end

end “‘

Note that the validator is initialized only once for the whole application life cycle, and not on each validation run.

The easiest way to add custom validators for validating individual attributes is with the convenient ActiveModel::EachValidator class.

“‘ class TitleValidator < ActiveModel::EachValidator

def validate_each(record, attribute, value)
  record.errors.add attribute, 'must be Mr., Mrs., or Dr.' unless %w(Mr. Mrs. Dr.).include?(value)
end

end “‘

This can now be used in combination with the validates method. See ActiveModel::Validations::ClassMethods#validates for more on this.

“‘ class Person

include ActiveModel::Validations
attr_accessor :title

validates :title, presence: true, title: true

end “‘

It can be useful to access the class that is using that validator when there are prerequisites such as an attr_accessor being present. This class is accessible via options[:class] in the constructor. To set up your validator override the constructor.

“‘ class MyValidator < ActiveModel::Validator

def initialize(options={})
  super
  options[:class].attr_accessor :custom_attribute
end

end “‘

Inherits from

Object

Attributes

Methods (defined here)

Used by

Subclasses (1)

Methods (inherited)

From Object (17)
From ActiveSupport::NumericWithFormat (2)

Type at least 2 characters to search.

Use the arrow keys to navigate results, Enter to open one, Escape to close.

Keyboard shortcuts

/
Focus search
⌘K / Ctrl-K
Command palette
?
This help
Esc
Close