2009-07-13 10 views
2

私は(Railscasts #167に基づいて)私の形式で、カンマ区切りのテキストボックスからエントリーモデルでタグを保存するために仮想属性を使用しています:ActiveRecordモデルの仮想属性を検証するにはどうすればよいですか?

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 

私はタグ名に検証を追加したいが、私はそれを行う最良の方法が何であるかはわかりません。 update_tags方法は、エントリがすでに保存された後、作成から検証エラーは次のようになり、保存した後に呼び出されているので、しかし、

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 

:私は、Tagモデルで定義された既存の検証メソッドを持っています。

私はエントリーモデル内で検証メソッドを作成し、保存したエントリでそれを呼び出すことが、考えている

:私はそれを行う場合

  1. が、私は最善の方法は、検証を行うにはよく分かりませんだろう。 Entryの範囲内で独自の検証を作成するか、名前ごとにTagオブジェクトを作成してt.valid?をチェックしますか?私はどういうわけかTagから検証エラーメッセージを収集するのでしょうか?
  2. これがこの種の検証を行う正​​しい方法であるかどうかはわかりません。

答えて

3

あなたがすでにそれを除外していないなら、私はvalidates_associatedを見てみましょう。

+0

私はそれを指摘してくれてありがとうございました。 –

+0

私は 'before_validation'と呼ばれる' update_tags'メソッドを動かしてみましたが、うまくいきましたが、保存時に自動的に関連付けが検証されているようです(無効なタグの重複エラーメッセージで終わっていました)。 –

+0

本当に 'validates_associated:tags'を追加するには十分でしたか?私は同じコードを持っていますが、検証通知の代わりに、1つ以上の新しいレコードを保存できないため、カテゴリを置き換えられませんでした。 – chodorowicz

0

このエラーは、無効な項目を関連付けに追加しようとすると表示されます。考えられる原因は、データを入力した後に関連付けられたモデルに検証を追加し、現在データベースに無効な値があることです。

関連する問題