Валідатори в Ruby on Rails гарантують, що дані вашого додатку будуть чистими та послідовними. Окрім вбудованих валідаторів, інколи потрібно розширити функціональність, використовуючи власні методи або сторонні геми. Цей посібник охоплює всі можливі сценарії валідації — від простих перевірок на наявність до складних валідацій з використанням гемів — так що ви можете безпосередньо скопіювати і вставити їх у свій Rails-проєкт.
Фото від Максима Мазура на Unsplash
Основні валідації
- Валідація на наявність
Перевіряє, чи поле не є порожнім або nil.
class User < ApplicationRecord
validates :name, presence: true
end
- Валідація довжини
Обмежує довжину рядка.
class Post < ApplicationRecord
validates :title, length: { minimum: 5, maximum: 100 }
end
3.
Валідація унікальності
Переконайтеся, що значення поля є унікальним в межах бази даних.
class User < ApplicationRecord
validates :email, uniqueness: true
end
Додайте індекс бази даних для безпеки:
add_index :users, :email, unique: true
- Валідація формату
Перевіряє, чи відповідає поле певному формату за допомогою регулярних виразів.
class User < ApplicationRecord
validates :email, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
end
- Валідація числових значень
Переконайтеся, що поле містить число.
class Product < ApplicationRecord
validates :price, numericality: { greater_than: 0 }
end
- Валідація включення
Переконайтеся, що значення належить до певного списку.
class User < ApplicationRecord
validates :role, inclusion: { in: %w[admin user guest] }
end
- Валідація виключення
Переконайтеся, що значення НЕ належить до певного списку.
class User < ApplicationRecord
validates :username, exclusion: { in: %w[admin superuser] }
end
8.
Валідація підтвердження
Переконайтеся, що два поля співпадають, наприклад, паролі.
class User < ApplicationRecord
validates :password, confirmation: true
end
- Валідація прийняття
Використовуйте це для чекбоксів із умовами на використання.
class User < ApplicationRecord
validates :terms_of_service, acceptance: true
end
Розширені налаштування валідації
- Користувацький метод валідації
Напишіть власну логіку валідації.
class User < ApplicationRecord
validate :age_must_be_above_18
def age_must_be_above_18
errors.add(:age, "must be greater than 18") if age.present? && age <= 18
end
end
Сторонні геми для валідацій
- Валідація електронної пошти: validatesemailformat_of
Додайте потужну валідацію електронної пошти за допомогою
гем validatesemailformat_of
Встановлення гему:
gem install validatesemailformatof_
Використання:
class User < ApplicationRecord
validates_email_format_of :email
end
Валідація номерів телефонів: phonelib
Додайте валідацію номерів телефонів за допомогою гему phonelib.
Встановлення гему:
gem install phonelib
```
Використання:
class User < ApplicationRecord
validates :phone, phone: true
end
- Валідація кредитних карток: active_merchant
Валідуйте номери кредитних карток за допомогою гему active_merchant.
Встановлення гему:
gem install activemerchant
Використання:
require 'active_merchant'
class Payment < ApplicationRecord
validate :valid_credit_card
def valid_credit_card
errors.add(:credit_card_number, "is invalid") unless ActiveMerchant::Billing::CreditCard.valid_number?(credit_card_number)
end
end
Валідація на надійність пароля: devise
Додайте валідацію на надійність пароля за допомогою гему devise.
Встановлення гему:
gem install devise
```
Використання:
class User < ApplicationRecord
validates :password, format: { with: /(?=.*[A-Z])(?=.*[0–9])(?=.*[!@#$&*])/, message: "повинен містити великі літери, цифри та спеціальні символи" }
end
- Валідація дат: validates_timeliness
Використовуйте гем validates_timeliness для розширених валідацій дат і часу.
Встановлення гему:
gem install validates_timeliness
Використання:
class Event < ApplicationRecord
validates_date :start_date, on_or_after: :today
end
Валідація IP-адреси: ipaddress
Переконайтеся, що поле містить правильну IP-адресу.
Встановлення гему:
gem install ipaddress
```
Використання:
class Network < ApplicationRecord
validate :valid_ip_address
def valid_ip_address
errors.add(:ip_address, "не є дійсною") unless IPAddress.valid?(ip_address)
end
end
Приклад ланцюгових валідацій
Комбінуйте кілька валідацій для одного поля.
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
validates :password, presence: true, length: { minimum: 8 }, confirmation: true
end
Кращі практики для валідацій
-
Виконання на рівні бази даних: Використовуйте обмеження бази даних (наприклад, NOT NULL, унікальні індекси) для доповнення валідацій Rails.
-
Повідомлення про помилки: Налаштовуйте повідомлення, щоб вони були зручними для користувача.
-
Чистота моделі: Використовуйте кастомні валідатори або сервіси для складних правил.
4.
Тестування валідацій: Пишіть тести, щоб переконатися, що ваші валідації працюють як очікується.
Висновок
Валідації в Ruby on Rails надають гнучкий та потужний спосіб підтримувати цілісність даних. Поєднуючи вбудовані хелпери Rails, кастомні методи та сторонні геми, ви можете ефективно покривати всі сценарії. Незалежно від того, створюєте ви малу програму чи масштабну систему, ці приклади допоможуть вам реалізувати валідації як професіоналу.
Дайте знати в коментарях, якщо у вас є додаткові сценарії для покриття або питання про валідації в Rails!
Перекладено з: Bulletproof Your Data: The Ultimate Guide to Validations in Ruby on Rails