私は(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モデルで定義された既存の検証メソッドを持っています。
私はエントリーモデル内で検証メソッドを作成し、保存したエントリでそれを呼び出すことが、考えている:私はそれを行う場合
- が、私は最善の方法は、検証を行うにはよく分かりませんだろう。
Entry
の範囲内で独自の検証を作成するか、名前ごとにTag
オブジェクトを作成してt.valid?
をチェックしますか?私はどういうわけかTag
から検証エラーメッセージを収集するのでしょうか? - これがこの種の検証を行う正しい方法であるかどうかはわかりません。
私はそれを指摘してくれてありがとうございました。 –
私は 'before_validation'と呼ばれる' update_tags'メソッドを動かしてみましたが、うまくいきましたが、保存時に自動的に関連付けが検証されているようです(無効なタグの重複エラーメッセージで終わっていました)。 –
本当に 'validates_associated:tags'を追加するには十分でしたか?私は同じコードを持っていますが、検証通知の代わりに、1つ以上の新しいレコードを保存できないため、カテゴリを置き換えられませんでした。 – chodorowicz