Добавление пользовательских проверок в модуль ActiveRecord через расширение? - PullRequest
3 голосов
/ 27 января 2012

Я пытаюсь переместить мои проверки в модуль. Я хочу расширить существующий объект набором валидаторов, но я изо всех сил пытаюсь понять, как заставить их выполнить. Есть идеи?

Объект активной записи

class Test < ActiveRecord::Base
  has_many :resources
end

Validator

module TestValidator
  extend ActiveSupport::Concern

  included do
    validates_associated :resources
  end
end

Консоль

t = Test.new
t.extend TestValidator
t.valid?
# true ... should be false

1 Ответ

6 голосов
/ 27 января 2012

Я надеюсь, что это может помочь

6.1. Пользовательские валидаторы. Пользовательские валидаторы - это классы, расширяющие ActiveModel :: Validator.Эти классы должны реализовывать метод validate, который принимает запись в качестве аргумента и выполняет проверку для нее.Пользовательский валидатор вызывается с помощью метода validates_with.

class MyValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'X'
      record.errors[:name] << 'Need a name starting with X please!'
    end
  end
end



class Person
  include ActiveModel::Validations
  validates_with MyValidator
end

Самый простой способ добавить пользовательские валидаторы для проверки отдельных атрибутов - это использовать ActiveModel :: EachValidator.В этом случае пользовательский класс валидатора должен реализовывать метод validate_each, который принимает три аргумента: запись, атрибут и значение, которые соответствуют экземпляру, проверяемый атрибут и значение атрибута в переданном экземпляре.

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end

class Person < ActiveRecord::Base
  validates :email, :presence => true, :email => true
end

Как показано в примере, вы также можете комбинировать стандартные валидации с вашими собственными валидаторами.

http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...