我有一个Entry
有很多Tag
s 的模型。通过虚拟属性将Tag
s 添加到我的表单上的文本框中,从而将它们添加到条目中。tag_names
在对Entry
模型进行验证之前,tag_names 字符串Tag
使用find_or_create_by_name
. 该Tag
模型还具有验证以确保标签名称与通过关联运行的正则表达式匹配。
我的 Entry 模型如下所示:
class Entry < ActiveRecord::Base
has_many :entry_tags
has_many :tags, :through => :entry_tags
before_validation :update_tags
attr_writer :tag_names
private
def update_tags
if @tag_names
self.tags = @tag_names.split(",").uniq.map do |name|
Tag.find_or_create_by_name(name.strip)
end
end
end
end
当我创建一个新Entry
对象并为其分配标签时,一切正常 - 如果其中一个Tag
s 上存在验证错误,则不会保存标签,并且会传回错误消息。但是,如果我尝试使用无效标记更新现有的 Entry 对象,而不是传回消息,我的self.tags=
调用(在update_tags
上面)会抛出带有验证错误消息的异常。即使我覆盖find_or_create_by_name
实际上只是返回一个新对象而不是调用create
,我也会得到相同的结果。
在我看来(并且文档似乎证实了)该tags=
调用实际上是在对象已经存在Tag
时保存主记录之前保存我的对象。Entry
我能做些什么来让这个保存不发生,或者阻止它引发异常并导致我的保存返回错误?