Валидаторы Rails — краткое руководство и шпаргалка

В сложном мире 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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *