Ruby on Rails
Проверка ActiveRecord
Поиск…
Проверка количественной характеристики атрибута
Эта проверка ограничивает вставку только числовых значений.
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