web-dev-qa-db-ja.com

Rails子エラーと親エラーをマージする

私は次の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ループの前に実行されます

したがって、問題は次のとおりです。DrivingExamInvigilatorAssignmentを検証し、そのエラーメッセージを独自のエラーハッシュにマージすることを確認するにはどうすればよいですか。

12
Abraham P

Stackoverflowに関するこの質問を参照してください:

Ruby on Rails:表示された子リソースからエラーメッセージを取得する方法は?

それはあなたが望むものに似ています。

2
Yahya