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作成しますか? 何らかの方法で検証エラー メッセージを収集したり生成したりできますか?Tagt.valid?Tag
  2. これがこの種の検証を行う正​​しい方法であるかどうかはわかりません。

助言がありますか?

4

2 に答える 2

4

まだ除外していない場合は、の使用を検討しvalidates_associatedます。

于 2009-07-14T05:27:22.007 に答える
0

関連付けに無効なアイテムを追加しようとすると、このエラーが発生します。考えられる原因としては、データを入力した後に関連付けられたモデルに検証を追加し、現在データベースに無効な値があることが考えられます。

于 2013-06-24T14:49:13.730 に答える