3

我正在使用虚拟属性将标签保存在表单中以逗号分隔的文本框中的 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 模型中创建一个验证方法并在输入保存时调用它,但是:

  1. 如果我这样做,我不确定进行验证的最佳方法是什么。我是在每个名称中创建自己的验证Entry还是为每个名称创建一个Tag对象并检查t.valid??我会以某种方式收集Tag或生成验证错误消息吗?
  2. 我不确定这是否是进行此类验证的正确方法。

有什么建议么?

4

2 回答 2

4

如果你还没有排除它,我会看看 using validates_associated.

于 2009-07-14T05:27:22.007 回答
0

当您尝试将无效项目添加到关联时,会出现此错误。一个可能的原因是您在输入数据后向关联模型添加了验证,并且您当前在数据库中存在无效值。

于 2013-06-24T14:49:13.730 回答