我正在使用虚拟属性将标签保存在表单中以逗号分隔的文本框中的 Entry 模型中(基于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
我想在我的标签名称上添加验证,但我不确定最好的方法是什么。我在 Tag 模型中定义了一个现有的验证方法:
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 模型中创建一个验证方法并在输入保存时调用它,但是:
- 如果我这样做,我不确定进行验证的最佳方法是什么。我是在每个名称中创建自己的验证
Entry
还是为每个名称创建一个Tag
对象并检查t.valid?
?我会以某种方式收集Tag
或生成验证错误消息吗? - 我不确定这是否是进行此类验证的正确方法。
有什么建议么?