модуль ActiveModel::Validations
Валидация ActiveModel
Предоставляет полную систему валидации для ваших объектов.
Минимальная реализация может быть такой:
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.to_s[0] == ?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 303 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 375 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 336 def valid?(context = nil) current_context, self.validation_context = validation_context, context errors.clear run_validations! ensure self.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 384 def validate!(context = nil) valid?(context) || raise_validation_error end
Выполняет все валидации в указанном контексте. Возвращает true, если ошибки не найдены, в противном случае вызывает ValidationError.
Валидации без опции :on будут выполняться независимо от контекста. Валидации с опцией :on будут выполняться только в указанном контексте.
# File activemodel/lib/active_model/validations/with.rb, line 137
def validates_with(*args, &block)
options = args.extract_options!
options[:class] = self.class
args.each do |klass|
validator = klass.new(options, &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, поскольку они применяются и проверяются в коллбеке.
Если вы передаете дополнительные параметры конфигурации, они будут переданы классу и доступны как options, для получения дополнительной информации, обратитесь к версии метода для класса.
Приватные методы экземпляров
# File activemodel/lib/active_model/validations.rb, line 413 def raise_validation_error # :doc: raise(ValidationError.new(self)) end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.