модуль ActiveModel::Validations
Валидации Active Model
Предоставляет вашим объектам полноценную платформу валидации.
Минимальная реализация может выглядеть так:
class Person
include ActiveModel::Validations
attr_accessor :first_name, :last_name
validates_each :first_name, :last_name do |record, attr, value|
record.errors.add attr, "starts with z." if value.start_with?("z")
end
end
Это предоставит вам полный стандартный набор средств валидации, знакомый по Active Record:
person = Person.new
person.valid? # => true
person.invalid? # => false
person.first_name = 'zoolander'
person.valid? # => false
person.invalid? # => true
person.errors.messages # => {first_name:["starts with z."]}
Обратите внимание: ActiveModel::Validations автоматически добавляет метод errors вашим экземплярам, инициализированным с новым объектом ActiveModel::Errors, поэтому вам не нужно делать это вручную.
Открытые методы экземпляра
# File activemodel/lib/active_model/validations.rb, line 330 def errors @errors ||= Errors.new(self) end
Возвращает объект Errors, содержащий всю информацию об ошибках атрибутов.
class Person
include ActiveModel::Validations
attr_accessor :name
validates_presence_of :name
end
person = Person.new
person.valid? # => false
person.errors # => #<ActiveModel::Errors:0x007fe603816640 @messages={name:["can't be blank"]}>
# File activemodel/lib/active_model/validations.rb, line 374 def freeze errors context_for_validation super end
# File activemodel/lib/active_model/validations.rb, line 410 def invalid?(context = nil) !valid?(context) end
Выполняет действие, обратное valid?. Возвращает true, если были добавлены ошибки, и false в противном случае.
class Person include ActiveModel::Validations attr_accessor :name validates_presence_of :name end person = Person.new person.name = '' person.invalid? # => true person.name = 'david' person.invalid? # => false
При необходимости можно указать контекст, чтобы задать, какие обратные вызовы следует проверять (контекст задаётся в валидациях с помощью :on).
class Person include ActiveModel::Validations attr_accessor :name validates_presence_of :name, on: :new end person = Person.new person.invalid? # => false person.invalid?(:new) # => true
# File activemodel/lib/active_model/validations.rb, line 363 def valid?(context = nil) current_context = validation_context context_for_validation.context = context errors.clear run_validations! ensure context_for_validation.context = current_context end
Запускает все указанные валидации и возвращает true, если ошибки не были добавлены, или false в противном случае.
class Person include ActiveModel::Validations attr_accessor :name validates_presence_of :name end person = Person.new person.name = '' person.valid? # => false person.name = 'david' person.valid? # => true
При необходимости можно указать контекст, чтобы задать, какие обратные вызовы следует проверять (контекст задаётся в валидациях с помощью :on).
class Person include ActiveModel::Validations attr_accessor :name validates_presence_of :name, on: :new end person = Person.new person.valid? # => true person.valid?(:new) # => false
# File activemodel/lib/active_model/validations.rb, line 419 def validate!(context = nil) valid?(context) || raise_validation_error end
Запускает все валидации в указанном контексте. Возвращает true, если ошибки не найдены, и в противном случае вызывает исключение ValidationError.
Validations без параметра :on запускается независимо от контекста. Validations с параметром :on запускается только в указанном контексте.
# File activemodel/lib/active_model/validations/with.rb, line 144
def validates_with(*args, &block)
options = args.extract_options!
options[:class] = self.class
args.each do |klass|
validator = klass.new(options.dup, &block)
validator.validate(self)
end
end Передаёт запись указанному классу или классам и позволяет им добавлять ошибки на основе более сложных условий.
class Person
include ActiveModel::Validations
validate :instance_validations
def instance_validations
validates_with MyValidator
end
end
Дополнительную информацию о создании собственного валидатора см. в документации к методу класса.
Можно также передать несколько классов, например:
class Person
include ActiveModel::Validations
validate :instance_validations, on: :create
def instance_validations
validates_with MyValidator, MyOtherValidator
end
end
Стандартные параметры конфигурации (:on, :if и :unless), доступные в версии validates_with для класса, следует указывать в методе validates, поскольку они применяются и проверяются в обратном вызове.
Если передать дополнительные параметры конфигурации, они будут переданы классу и станут доступны как options. Дополнительную информацию см. в версии этого метода для класса.
# File activemodel/lib/active_model/validations.rb, line 442 def validation_context context_for_validation.context end
Возвращает контекст, в котором выполняются валидации.
Закрытые методы экземпляра
# File activemodel/lib/active_model/validations.rb, line 466 def raise_validation_error # :doc: raise(ValidationError.new(self)) end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.