В сложном мире Rails, что именно такое валидаторы и как их использовать? В этом блоге я сделаю обзор валидаторов Rails и приведу несколько распространенных и полезных примеров. В руководстве по Rails говорится, что «валидаторы используются для того, чтобы гарантировать, что в вашу базу данных сохраняются только достоверные данные». В качестве глупой аналогии можно рассматривать валидаторы как вышибал бэкенда, следящих за тем, чтобы все данные были одеты соответствующим образом перед тем, как попасть в базу данных клуба. «Валидация на уровне модели — лучший способ убедиться, что только достоверные данные сохраняются в вашей базе данных». Валидации на стороне клиента возможны, но могут быть небезопасными или неэффективными при использовании в одиночку. Внутренние проверки гарантируют, что ваша база данных получает только безопасные и подходящие данные.
Что вызывает валидацию?
Проверка выполняется, когда в базу данных вносятся какие-либо изменения. Чаще всего вы сталкиваетесь с этим при .save
или .create
, но вы также можете вручную вызвать проверку с помощью .valid?
или .invalid?
. Существует также встроенный метод проверки on:
, который позволяет определить, когда будет запущена проверка:
class User < ApplicationRecord
validates :age, numericality: true, on: :update
end
Общие встроенные методы валидации
Active Record имеет множество встроенных методов валидации, которые можно использовать для общих нужд валидации. Каждый раз, когда эти валидаторы не срабатывают, они выдают ошибку, которую вы можете обработать по-своему (подробнее об этом позже). Одним из наиболее распространенных встроенных валидаторов является presence:
, который проверяет, было ли введено/существует ли определенное значение.
class User < ApplicationRecord
validates :username, presence: true
end
*Обратите внимание, что атрибуты могут быть объединены в цепочку, если для каждого из них необходимо обеспечить один и тот же тип проверки:
class User < ApplicationRecord
validates :username, :birthday, :full_name, presence: true
end
presence:
лучше всего использовать, когда у вас нет других валидаций. Если у вас есть другая валидация для того же атрибута, presence:
становится неявной и не требуется.
Другой распространенной встроенной проверкой является length:
, которая проверяет различные ограничения длины:
class User < ApplicationRecord
validates :name, length: { minimum: 2 }
validates :bio, length: { maximum: 500 }
validates :password, length: { in: 6..20 }
validates :drivers_license, length: { is: 9 }
end
Валидатор length:
может быть использован против множества различных ограничений, таких как максимум, минимум, точная длина или диапазон.
numericality:
используется для проверки числового значения атрибута.
class User < ApplicationRecord
validates :birthday, numericality: true
validates :phone_number, numericality: { only_integer: true }
end
Существует множество ограничений numericality:
, включая: :greater_than
, :greater_than_or_equal_to
, :equal_to
, :less_than
, : less_than_or_equal_to
, :other_than
, :in
(задает диапазон), :odd
, :even
. Эти валидаторы могут использоваться для самых разных целей и имеют интуитивно понятные названия для удобства использования.
inclusion:
— еще один полезный валидатор, который может гарантировать, что определенное значение включено. Это может быть полезно, если пользователю предлагается список опций на выбор, и он должен быть ограничен этим списком.
class User < ApplicationRecord
validates :eye_color, inclusion: ["brown", "blue", "hazel", "green", "grey"]
end
Еще один очень распространенный валидатор — uniqueness:
, он важен для того, чтобы данные, такие как имя пользователя или электронная почта, были полностью уникальными для конкретного пользователя.
class User < ApplicationRecord
validates :username, uniqueness: true
end
Некоторые интересные валидации — :allow_blank
и :allow_nil
, эти валидации используются в обход встроенной presence: true
, так что если информация введена, она может быть проверена, но также может быть оставлена пустой или нулевой.
class User < ApplicationRecord
validates :bio, length: { minimum: 250 }, allow_blank: true
end
Вы также можете реализовать условную проверку, которая срабатывает только при выполнении определенного условия.
class Order < ApplicationRecord
validates :card_number, presence: true, if: :paid_with_card?
def paid_with_card?
payment_type == "card"
end
end
Также можно ограничить валидацию определенными рамками.
class Gate < ApplicationRecord
validates :gate_num, uniqueness: { scope: :terminal }
end
Пользовательские валидации
Выше перечислены лишь некоторые из множества встроенных методов проверки Active Record, однако, если этих методов недостаточно, у нас есть возможность создавать собственные пользовательские проверки. Синтаксис выглядит следующим образом:
class CustomValidator < ActiveModel::Validator
def validate(record)
unless record.species == 'dog'
record.errors.add :species, "Dogs only!"
end
end
end
Распространенной синтаксической ошибкой при использовании пользовательских валидаций является то, что пользовательские валидации используют validate
, а не validates
. Когда вы сочетаете собственные пользовательские валидации с огромным количеством встроенных методов, возможности валидации становятся практически безграничными!
Обработка ошибок
Способ обработки ошибок — это большая тема, выходящая за рамки данного блога, поскольку Rails предоставляет вам множество вариантов, однако я хотел бы выделить встроенный метод message:
, поскольку он встроен непосредственно в ваши валидации.
class User < ApplicationRecord
validates :username, presence: { message: "must be given please" }
end
Заключение
Валидации в Rails — это простой и эффективный способ убедиться в том, что вы допускаете соответствующие и безопасные данные в вашу базу данных. Вы можете выбрать один из многочисленных встроенных методов валидации для наиболее распространенных потребностей в валидации или использовать творческую свободу и разработать собственные валидации для уникальных потребностей.
-Источники-
Руководства по Ruby on Rails