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

Валидатор длины Active Model Validator

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

errors() Показать исходный код

Возвращает объект 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 282
def errors
  @errors ||= Errors.new(self)
end
invalid?(context = nil) Показать исходный код

Выполняет обратное действие 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 352
def invalid?(context = nil)
  !valid?(context)
end
valid?(context = nil) Показать исходный код

Выполняет все указанные валидации и возвращает 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 315
def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end
validates_with(*args, &block) Показать исходный код

Передает запись указанному классу или классам, позволяя им добавлять ошибки на основе более сложных условий.

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/with.rb, line 140
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

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

Spec-Zone.ru

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