私は次の2つの(消毒/様式化された)モデルを持っています:
class DrivingExam < ActiveRecord::Base
belongs_to :dmv_rules
has_many :invigilator_assignments, as: :assignable
has_many :invigilator, through: :invigilator_assignments
validate do |record|
record.invigilator_assignments.each do |i|
next if i.valid?
i.errors.full_messages.each do |msg|
errors.add_to_base(msg)
end
end
end
end
class InvigilatorAssignment < ActiveRecord::Base
attr_accessible :invigilator_id
belongs_to :assignable, polymorphic: true
belongs_to :invigilator
validates :invigilator_id, presence: true
validates_each :invigilator do |record, attr, value|
if record.assignable.is_a?(DrivingExam) && !value.no_scheduling_conflicts?
record.errors.add attr, "This Invigilator has a scheduling conflict"
end
end
end
これらは、次の方法でDrivingExamController
から呼び出されます。
if @driving_exam.save
予想される動作は、モデルが検証でfalseを返し、子メッセージを親エラーハッシュに結合して、これをコントローラーに渡すことです。
代わりに起こることは、ページが422(これは奇妙です)で保存に失敗し(これは良いです)、メッセージを渡さないということです。
上記のコード全体にputs
ステートメントを追加することで、次のことを確立しました。
1)validates_each
内のif条件が成功したため、record.errors
配列がInvigilatorAssignment
モデル内に設定されます。
2)validate do
ループでは、インビジレーターの割り当ては有効であり、エラーはありません
3)validate do
ループはvalidates_each
ループの前に実行されます
したがって、問題は次のとおりです。DrivingExam
がInvigilatorAssignment
を検証し、そのエラーメッセージを独自のエラーハッシュにマージすることを確認するにはどうすればよいですか。