2009-07-13 80 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

當您嘗試向關聯添加無效項目時出現此錯誤。一個可能的原因是您在輸入數據後向相關模型添加了驗證,並且您當前在數據庫中具有無效值。