从Rails中的虚拟属性引发验证错误

时间:2014-04-07 06:23:08

标签: ruby-on-rails validation ruby-on-rails-4 virtual-attribute

我有两个模型:Source和SourceType。当然来源属于SourceType 我想创建新的源并为其分配适当的sourcetype对象。 '适当'表示源对象的一个​​虚拟属性与某些sourceType对象测试regexpression匹配,后者成为源类型。

我在源对象

中有一个属性编写器
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。如果没有源类型适合输入,如何引发验证错误,以便用户可以在表单中看到错误原因?

1 个答案:

答案 0 :(得分:2)

<强>验证

如果使用attr_accessor设置虚拟属性,则应该能够对要发送数据的模型进行验证(如果您想要在嵌套模型上进行验证,请使用inverse_of ):

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

  

现在可以与validates方法结合使用(有关详细信息,请参阅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