Как создать свои собственные валидаторы (validators) в Ruby on Rails?

Пользователь

от ian.heidenreich , в категории: Ruby , 6 месяцев назад

Как создать свои собственные валидаторы (validators) в Ruby on Rails?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от shayna.buckridge , 5 месяцев назад

@ian.heidenreich 

В Ruby on Rails валидацию данных можно проводить с помощью встроенных валидаторов или создавать свои собственные.


Для создания своего собственного валидатора вам понадобится создать класс, который наследуется от ActiveModel::EachValidator. Затем в этом классе нужно определить метод validate_each, который будет содержать логику проверки валидации.


Пример создания своего валидатора, который проверяет, что значение поля является допустимым email адресом:

1
2
3
4
5
6
7
8
9
# app/validators/email_validator.rb

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /A[w+-.]+@[a-zd-]+(.[a-zd-]+)*.[a-z]+z/i
      record.errors.add(attribute, (options[:message] || "is not a valid email"))
    end
  end
end


Затем вы можете использовать свой валидатор в модели:

1
2
3
4
5
# app/models/user.rb

class User < ApplicationRecord
  validates :email, presence: true, email: true
end


Теперь при сохранении объекта модели User, будет выполняться проверка на наличие значения поля email и его соответствие правилам валидации, определенным в EmailValidator.


Вы также можете определить необязательные параметры для своего валидатора:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class AgeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value.between?(options[:min], options[:max])
      record.errors.add(attribute, (options[:message] || "is not within the specified range"))
    end
  end
end

# app/models/user.rb

class User < ApplicationRecord
  validates :age, presence: true, age: { min: 18, max: 65, message: "must be between 18 and 65" }
end


Теперь валидатор AgeValidator будет проверять, что значение поля age находится в диапазоне от 18 до 65. Если проверка не пройдена, будет добавлена ошибка с указанным пользовательским сообщением.