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

Атрибуты

validation_context[RW]

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

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"]}>
invalid?(context = nil) Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 402
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, 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 411
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 49
      

Возвращает контекст при выполнении валидаций.

Это полезно при выполнении валидаций, за исключением определенного контекста (противоположно опции on).

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates :name, presence: true, if: -> { validation_context != :custom }
end

person = Person.new
person.valid?          #=> false
person.valid?(:new)    #=> false
person.valid?(:custom) #=> true

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

raise_validation_error() Показать исходный код
# File activemodel/lib/active_model/validations.rb, line 445
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