2009-07-13 58 views
2

我使用虚拟属性保存标签从我的形式以逗号分隔的文本一款入门机型(基于Railscasts #167):如何验证ActiveRecord模型中的虚拟属性?

class Entry < ActiveRecord::Base 
    has_many :entry_tags 
    has_many :tags, :through => :entry_tags 

    after_save :update_tags 
    attr_writer :tag_names 

    def tag_names 
    tags.map(&:name).join(", ") 
    end 

    def update_tags 
    if @tag_names 
     self.tags = @tag_names.split(",").map do |name| 
     Tag.find_or_create_by_name(name.strip) 
     end 
    end 
    end 
    private :update_tags 
end 

我想对我的标签名称添加验证,但我不知道最好的办法是什么。我在标签模型定义的现有验证方法:

class Tag < ActiveRecord::Base 
    has_many :entry_tags 
    has_many :entries, :through => :entry_tags 

    validates_uniqueness_of :name 
    validates_format_of :name, :with => /\A[a-z0-9_ -]*\Z/, :on => :create 
end 

但是,因为update_tags方法被调用后保存,从任何验证错误的创建已经保存在入世后会。

我在想入门车型中创建一个验证方法,并要求在项保存,但是:

  1. 如果我这样做,我不知道什么是最好的方式做验证将会。我是否在Entry内创建了自己的验证,或者为每个名称创建了Tag对象,并检查t.valid??我会以某种方式收集来自Tag的验证错误消息还是生成它们?
  2. 我不确定这是否是正确的方式来做这种验证。

有什么建议吗?

回答

3

如果你还没有排除它,我会看看使用validates_associated

+0

我不熟悉这一点,谢谢指出。 – 2009-07-14 14:24:57

0

当您尝试向关联添加无效项目时出现此错误。一个可能的原因是您在输入数据后向相关模型添加了验证,并且您当前在数据库中具有无效值。