我正在使用虚拟属性从表单中逗号分隔的文本框(基于
Railscasts #167
):
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?
?我能从中收集验证错误消息吗?
标签
或者生成它们?
-
我不确定这是否是进行这种验证的正确方法。
有什么建议吗?