我使用虛擬屬性保存標籤從我的形式以逗號分隔的文本一款入門機型(基於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
方法被調用後保存,從任何驗證錯誤的創建已經保存在入世後會。
我在想入門車型中創建一個驗證方法,並要求在項保存,但是:
- 如果我這樣做,我不知道什麼是最好的方式做驗證將會。我是否在
Entry
內創建了自己的驗證,或者爲每個名稱創建了Tag
對象,並檢查t.valid?
?我會以某種方式收集來自Tag
的驗證錯誤消息還是生成它們? - 我不確定這是否是正確的方式來做這種驗證。
有什麼建議嗎?
我不熟悉這一點,謝謝指出。 – 2009-07-14 14:24:57