親が子供と 1..n である次の親子関係を考えてみましょう (ここでは関連するもののみ)...
class Parent < ActiveRecord::Base
# !EDIT! - was missing this require originally -- was the root cause!
require "Kid"
has_many :kids, :dependent => :destroy, :validate => true
accepts_nested_attributes_for :kids
validates_associated :kids
end
class Kid < ActiveRecord::Base
belongs_to :parent
# for simplicity, assume a single field: @item
validates_presence_of :item, :message => "is expected"
end
Kid モデルの validates_presence_of メソッドは、検証の失敗時に期待どおりに機能し、Item is expected
指定されたカスタム メッセージ属性ごとに最終的な文字列を生成します。
しかし、試してみるとvalidates_with
、代わりに...
class Kid < ActiveRecord::Base
belongs_to :parent
validates_with TrivialValidator
end
class TrivialValidator
def validate
if record.item != "good"
record.errors[:base] << "Bad item!"
end
end
end
NameError - uninitialized constant Parent::Kid
...Rails は、ユーザー データの作成 (初期永続化) を試行した後だけでなく、初期フォームを構築しようとしたときにもエラーを返します。コントローラからの関連ビット:
def new
@parent = Parent.new
@parent.kids.new # NameError, validates_* methods called within
end
def create
@parent = Parent.new(params[:parent])
@parent.save # NameError, validates_* methods called within
end
このエラーは、エラー メッセージを作成するためのモデル名 (およびおそらくフィールド名?) の解決中のどこかで、何か問題が発生したことを示唆しています。しかし、なぜ一部のvalidates_*
メソッドでは発生し、他のメソッドでは発生しないのでしょうか?
これで壁にぶち当たった人いますか?特にモデル名に関して、この作業を行うために省略した儀式が必要ですか?