我使用虚拟属性保存标签从我的形式以逗号分隔的文本一款入门机型(基于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