Поиск…


Проверка количественной характеристики атрибута

Эта проверка ограничивает вставку только числовых значений.

class Player < ApplicationRecord
  validates :points, numericality: true
  validates :games_played, numericality: { only_integer: true }
end

Кроме того :only_integer , этот помощник также принимает следующие параметры для добавления ограничений к допустимым значениям:

  • :greater_than - указывает, что значение должно быть больше :greater_than значения. Сообщение об ошибке по умолчанию для этого параметра «должно быть больше% {count}».
  • :greater_than_or_equal_to - Указывает, что значение должно быть больше или равно :greater_than_or_equal_to значению. Сообщение об ошибке по умолчанию для этой опции «должно быть больше или равно% {count}».
  • :equal_to - Указывает, что значение должно быть равно :equal_to значению. Сообщение об ошибке по умолчанию для этой опции «должно быть равно% {count}».
  • :less_than - Указывает, что значение должно быть меньше :less_than значения. Сообщение об ошибке по умолчанию для этого параметра «должно быть меньше% {count}».
  • :less_than_or_equal_to - Указывает, что значение должно быть меньше или равно :less_than_or_equal_to значению. Сообщение об ошибке по умолчанию для этого параметра «должно быть меньше или равно% {count}».
  • :other_than - Указывает, что значение должно быть иным, чем заданное значение. Сообщение об ошибке по умолчанию для этой опции «должно быть отличным от% {count}».
  • :odd - указывает, что значение должно быть нечетным числом, если установлено значение true. Сообщение об ошибке по умолчанию для этой опции «должно быть нечетным».
  • :even - Указывает, что значение должно быть четным числом, если установлено значение true. Сообщение об ошибке по умолчанию для этой опции «должно быть четным».

По умолчанию численное значение не допускает значений nil. Вы можете использовать allow_nil: true, чтобы разрешить это.

Проверка уникальности атрибута

Этот помощник подтверждает, что значение атрибута уникально непосредственно перед тем, как объект будет сохранен.

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

Существует опция :scope которую вы можете использовать для указания одного или нескольких атрибутов, которые используются для ограничения проверки уникальности:

class Holiday < ApplicationRecord
  validates :name, uniqueness: { scope: :year,
    message: "should happen once per year" }
end

Также существует опция :case_sensitive которую вы можете использовать для определения того, будет ли ограничение уникальности чувствительным к регистру или нет. Эта опция по умолчанию имеет значение true .

class Person < ApplicationRecord
  validates :name, uniqueness: { case_sensitive: false }
end

Проверка наличия атрибута

Этот помощник проверяет, что указанные атрибуты не пусты.

class Person < ApplicationRecord
  validates :name, presence: true
end

Person.create(name: "John").valid? # => true
Person.create(name: nil).valid? # => false

Вы можете использовать помощник absence чтобы проверить, что указанные атрибуты отсутствуют. Он использует present? метод для проверки нулевого или пустого значений.

class Person < ApplicationRecord
  validates :name, :login, :email, absence: true
end

Примечание. Если атрибут является boolean , вы не можете использовать обычную проверку присутствия (атрибут недействителен для false значения). Вы можете сделать это, используя проверку включения:

validates :attribute, inclusion: [true, false]

Пропуск проверки

Используйте следующие методы, если вы хотите пропустить проверки. Эти методы сохранят объект в базе данных, даже если он недействителен.

  • уменьшаем!
  • decrement_counter
  • увеличиваем!
  • increment_counter
  • переключения!
  • потрогать
  • обновить все
  • update_attribute
  • update_column
  • update_columns
  • update_counters

Вы также можете пропустить проверку при сохранении, пройдя validate в качестве аргумента для save

User.save(validate: false)

Проверка длины атрибута

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end

Возможные варианты ограничения длины:

  • :minimum - атрибут не может иметь меньше заданной длины.
  • :maximum - атрибут не может иметь больше указанной длины.
  • :in (или :within ) - длина атрибута должна быть включена в заданный интервал. Значение для этой опции должно быть диапазоном.
  • :is - Длина атрибута должна быть равна заданному значению.

Подтверждение группировки

Иногда полезно иметь несколько проверок, используя одно условие. Его можно легко достичь, используя with_options.

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

Все проверки внутри блока with_options автоматически передают условие, если:: is_admin?

Пользовательские проверки

Вы можете добавить свои собственные проверки, добавив новые классы, наследующие от ActiveModel::Validator или из ActiveModel::EachValidator . Оба метода похожи, но они работают несколько иначе:

ActiveModel::Validator и validates_with

Внедрите метод validate который принимает запись как аргумент и выполняет проверку на нем. Затем используйте validates_with с классом модели.

# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'A'
      record.errors[:name] << 'Need a name starting with A please!'
    end
  end
end
 
class Person < ApplicationRecord
  validates_with StartsWithAValidator
end

ActiveModel::EachValidator и validate

Если вы предпочитаете использовать свой новый валидатор с использованием общего метода validate на одном параметре, создайте класс, наследующий от ActiveModel::EachValidator и реализуйте метод validate_each который принимает три аргумента: record , attribute и value :

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || 'is not an email')
    end
  end
end
 
class Person < ApplicationRecord
  validates :email, presence: true, email: true
end

Дополнительная информация о направляющих Rails .

Проверяет формат атрибута

Подтвердить , что значение атрибута соответствует регулярному выражению , используя format и with опцией.

class User < ApplicationRecord
  validates :name, format: { with: /\A\w{6,10}\z/ }
end

Вы также можете определить константу и установить ее значение в регулярное выражение и передать ее опции with: . Это может быть более удобным для действительно сложных регулярных выражений

PHONE_REGEX = /\A\(\d{3}\)\d{3}-\d{4}\z/
validates :phone, format: { with: PHONE_REGEX }

Сообщение об ошибке по умолчанию является is invalid . Это можно изменить с помощью опции :message .

validates :bio, format: { with: /\A\D+\z/, message: "Numbers are not allowed" }

Обратное также отвечает, и вы можете указать, что значение не должно соответствовать регулярному выражению с параметром without:

Проверяет включение атрибута

Вы можете проверить, включено ли значение в массив с помощью inclusion: helper. Параметр :in и его псевдоним :within отображают набор допустимых значений.

class Country < ApplicationRecord
  validates :continent, inclusion: { in: %w(Africa Antartica Asia Australia
                                            Europe North America South America) }
end

Чтобы проверить, не включено ли значение в массив, используйте exclusion: хелпер

class User < ApplicationRecord
  validates :name, exclusion: { in: %w(admin administrator owner) }
end

Условная проверка

Иногда вам может потребоваться подтверждение записи только при определенных условиях.

class User < ApplicationRecord
  validates :name, presence: true, if: :admin? 

  def admin?
    conditional here that returns boolean value
  end
end

Если вы условно очень малы, вы можете использовать Proc:

class User < ApplicationRecord
  validates :first_name, presence: true, if: Proc.new { |user| user.last_name.blank? }
end

Для отрицательных условных вы можете использовать, unless :

class User < ApplicationRecord
  validates :first_name, presence: true, unless: Proc.new { |user| user.last_name.present? }
end

Вы также можете передать строку, которая будет выполнена через instance_eval :

class User < ApplicationRecord
  validates :first_name, presence: true, if: 'last_name.blank?'
end

Подтверждение атрибута

Вы должны использовать это, когда у вас есть два текстовых поля, которые должны получать точно такое же содержимое. Например, вы можете подтвердить адрес электронной почты или пароль. Эта проверка создает виртуальный атрибут, имя которого является именем поля, которое должно быть подтверждено добавлением _confirmation .

class Person < ApplicationRecord
  validates :email, confirmation: true
end

Примечание. Эта проверка выполняется только в том случае, если email_confirmation не равна нулю.

Чтобы потребовать подтверждения, обязательно добавьте проверку наличия для атрибута подтверждения.

class Person < ApplicationRecord
  validates :email,      confirmation: true
  validates :email_confirmation, presence: true
end

Источник

Использование: по опции

Опция :on позволяет указать, когда должна произойти проверка. Поведение по умолчанию для всех встроенных помощников проверки должно выполняться при сохранении (как при создании новой записи, так и при ее обновлении).

class Person < ApplicationRecord
  # it will be possible to update email with a duplicated value
  validates :email, uniqueness: true, on: :create
 
  # it will be possible to create the record with a non-numerical age
  validates :age, numericality: true, on: :update
 
  # the default (validates on both create and update)
  validates :name, presence: true
end


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow