Class: ActiveModel::Validator
- Defined in:
- activemodel/lib/active_model/validator.rb
Overview
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
# => 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()
super
@my_custom_field = [: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(={})
super
[:class].attr_accessor :custom_attribute
end
end
Direct Known Subclasses
Instance Attribute Summary collapse
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Class Method Summary collapse
-
.kind ⇒ Object
Returns the kind of the validator.
Instance Method Summary collapse
-
#initialize(options = {}) ⇒ Validator
constructor
Accepts options that will be made available through the
options
reader. -
#kind ⇒ Object
Returns the kind for this validator.
-
#validate(record) ⇒ Object
Override this method in subclasses with validation logic, adding errors to the records
errors
array where necessary.
Constructor Details
#initialize(options = {}) ⇒ Validator
Accepts options that will be made available through the options
reader.
108 109 110 |
# File 'activemodel/lib/active_model/validator.rb', line 108 def initialize( = {}) @options = .except(:class).freeze end |
Instance Attribute Details
#options ⇒ Object (readonly)
Returns the value of attribute options
97 98 99 |
# File 'activemodel/lib/active_model/validator.rb', line 97 def @options end |
Class Method Details
.kind ⇒ Object
Returns the kind of the validator.
PresenceValidator.kind # => :presence
AcceptanceValidator.kind # => :acceptance
103 104 105 |
# File 'activemodel/lib/active_model/validator.rb', line 103 def self.kind @kind ||= name.split("::").last.underscore.chomp("_validator").to_sym unless anonymous? end |
Instance Method Details
#kind ⇒ Object
Returns the kind for this validator.
PresenceValidator.new(attributes: [:username]).kind # => :presence
AcceptanceValidator.new(attributes: [:terms]).kind # => :acceptance
116 117 118 |
# File 'activemodel/lib/active_model/validator.rb', line 116 def kind self.class.kind end |
#validate(record) ⇒ Object
Override this method in subclasses with validation logic, adding errors to the records errors
array where necessary.
122 123 124 |
# File 'activemodel/lib/active_model/validator.rb', line 122 def validate(record) raise NotImplementedError, "Subclasses must implement a validate(record) method." end |