Поднять ошибку проверки из виртуального атрибута в Rails

У меня есть две модели: Source и SourceType. Источник, конечно же, принадлежит SourceType.
Я хочу создать новый источник и назначить ему правильный объект типа источника. "Правильно" означает, что один виртуальный атрибут исходного объекта соответствует некоторому тестовому регулярному выражению объектов sourceType, которое становится типом источника.

У меня есть писатель атрибутов в исходном объекте

class Source < ActiveRecord::Base
   belongs_to :source_type    
   def url=(value)
       SourceType.each do |type|
          # here i match type's regexp to input value and if match, 
          # assign it to the new source object
       end
   end
end

Я не хочу создавать какой-либо собственный валидатор, потому что ему нужно будет дважды запускать SourceTypes. Как вызвать ошибку проверки, если исходные типы не подходят для ввода, чтобы пользователь мог видеть причины ошибки в форме?


person Roaring Stones    schedule 07.04.2014    source источник


Ответы (1)


Проверка

Если вы установите виртуальный атрибут с помощью attr_accessor, вы сможете проверить модель, которую вы повторная отправка данных (альтернативно используя inverse_of если вы хотите проверить вложенную модель):

http://api.rubyonrails.org/classes/ActiveModel/Validator.html

Теперь это можно использовать в сочетании с методом валидации (подробнее об этом см. ActiveModel::Validations::ClassMethods.validates).

class Person
  include ActiveModel::Validations
  attr_accessor :title

  validates :title, presence: true
end

Код

я бы сделал так:

class Source < ActiveRecord::Base
   belongs_to :source_type, inverse_of: :sources
   attr_accessor :url
end

class SourceType < ActiveRecord::Base
   has_many :sources, inverse_of: :source_type
   validates :source_type_attr, presence: { if: :url_match? }

   def url_match?
      self.sources.url == [your_regex]
   end
end
person Richard Peck    schedule 07.04.2014