仮想属性を使用して、フォームのコンマ区切りテキストボックスから 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 モデル内に検証メソッドを作成し、エントリの保存時にそれを呼び出すことを考えていますが、次のようになります。
- 私がそうすると、検証を行うための最良の方法が何であるかわかりません。内に独自の検証を作成するか、名前とチェックごとにオブジェクトを
Entry
作成しますか? 何らかの方法で検証エラー メッセージを収集したり生成したりできますか?Tag
t.valid?
Tag
- これがこの種の検証を行う正しい方法であるかどうかはわかりません。
助言がありますか?