Непробивна захист ваших даних: Останнє слово в валідаціях у Ruby on Rails

Валідатори в Ruby on Rails гарантують, що дані вашого додатку будуть чистими та послідовними. Окрім вбудованих валідаторів, інколи потрібно розширити функціональність, використовуючи власні методи або сторонні геми. Цей посібник охоплює всі можливі сценарії валідації — від простих перевірок на наявність до складних валідацій з використанням гемів — так що ви можете безпосередньо скопіювати і вставити їх у свій Rails-проєкт.

pic

Фото від Максима Мазура на Unsplash

Основні валідації

  1. Валідація на наявність

Перевіряє, чи поле не є порожнім або nil.

class User < ApplicationRecord  
 validates :name, presence: true  
end
  1. Валідація довжини

Обмежує довжину рядка.

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
  1. Валідація формату

Перевіряє, чи відповідає поле певному формату за допомогою регулярних виразів.

class User < ApplicationRecord  
 validates :email, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }  
end
  1. Валідація числових значень

Переконайтеся, що поле містить число.

class Product < ApplicationRecord  
 validates :price, numericality: { greater_than: 0 }  
end
  1. Валідація включення

Переконайтеся, що значення належить до певного списку.

class User < ApplicationRecord  
 validates :role, inclusion: { in: %w[admin user guest] }  
end
  1. Валідація виключення

Переконайтеся, що значення НЕ належить до певного списку.

class User < ApplicationRecord  
 validates :username, exclusion: { in: %w[admin superuser] }  
end

8.
Валідація підтвердження

Переконайтеся, що два поля співпадають, наприклад, паролі.

class User < ApplicationRecord  
 validates :password, confirmation: true  
end
  1. Валідація прийняття

Використовуйте це для чекбоксів із умовами на використання.

class User < ApplicationRecord  
 validates :terms_of_service, acceptance: true  
end

Розширені налаштування валідації

  1. Користувацький метод валідації

Напишіть власну логіку валідації.

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

Сторонні геми для валідацій

  1. Валідація електронної пошти: 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
  1. Валідація кредитних карток: 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
  1. Валідація дат: 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

Кращі практики для валідацій

  1. Виконання на рівні бази даних: Використовуйте обмеження бази даних (наприклад, NOT NULL, унікальні індекси) для доповнення валідацій Rails.

  2. Повідомлення про помилки: Налаштовуйте повідомлення, щоб вони були зручними для користувача.

  3. Чистота моделі: Використовуйте кастомні валідатори або сервіси для складних правил.

4.
Тестування валідацій: Пишіть тести, щоб переконатися, що ваші валідації працюють як очікується.

Висновок

Валідації в Ruby on Rails надають гнучкий та потужний спосіб підтримувати цілісність даних. Поєднуючи вбудовані хелпери Rails, кастомні методи та сторонні геми, ви можете ефективно покривати всі сценарії. Незалежно від того, створюєте ви малу програму чи масштабну систему, ці приклади допоможуть вам реалізувати валідації як професіоналу.

Дайте знати в коментарях, якщо у вас є додаткові сценарії для покриття або питання про валідації в Rails!

Перекладено з: Bulletproof Your Data: The Ultimate Guide to Validations in Ruby on Rails

Leave a Reply

Your email address will not be published. Required fields are marked *