Spec-Zone.ru › Ruby on Rails 5.1

модуль ActiveModel::Validations

Включенные модули:
ActiveModel::Validations::HelperMethods

Валидация 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.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, поэтому вам не нужно делать это вручную.

Общедоступные методы экземпляров

errors() Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 299
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"]}>
invalid?(context = nil) Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 371
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
valid?(context = nil) Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 332
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
Также алиас: validate
validate(context = nil)
Псевдоним для: valid?
validate!(context = nil) Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 380
def validate!(context = nil)
  valid?(context) || raise_validation_error
end

Выполняет все валидации в указанном контексте. Возвращает true, если ошибки не найдены, в противном случае генерирует исключение ValidationError.

Валидации Validations без опции :on будут выполняться независимо от контекста. Валидации Validations с опцией :on будут выполняться только в указанном контексте.

validates_with(*args, &block) Показать исходный код
# File activemodel/lib/active_model/validations/with.rb, line 135
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_with, должны вместо этого быть размещены в методе validates, так как они применяются и проверяются в коллбеке.

Если вы передаете дополнительные параметры конфигурации, они будут переданы классу и доступны как options, для получения дополнительной информации обратитесь к версии метода класса.

Приватные методы экземпляров

raise_validation_error() Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 409
def raise_validation_error # :doc:
  raise(ValidationError.new(self))
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API