Spec-Zone.ru › Ruby on Rails 8.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.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, поэтому вам не нужно делать это вручную.

Открытые методы экземпляра

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"]}>
freeze () Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 374
def freeze
  errors
  context_for_validation

  super
end
Вызывает метод суперкласса
invalid? (context = nil) Показать исходный код
# 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
valid? (context = nil) Показать исходный код
# 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
Также имеет псевдоним: validate
validate (context = nil)
Псевдоним для: valid?
validate! (context = nil) Показать исходный код
# 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 запускается только в указанном контексте.

validates_with (*args, &block) Показать исходный код
# 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. Дополнительную информацию см. в версии этого метода для класса.

validation_context () Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 442
def validation_context
  context_for_validation.context
end

Возвращает контекст, в котором выполняются валидации.

Закрытые методы экземпляра

raise_validation_error () Показать исходный код
# 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.

Spec-Zone.ru

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