Rails将父错误与子错误合并

时间:2013-05-07 23:11:53

标签: ruby ruby-on-rails-3 validation associations rails-activerecord

我有以下两种(消毒/程式化)模型:

 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并将其错误消息合并到自己的错误哈希中。

1 个答案:

答案 0 :(得分:2)

请参阅stackoverflow上的这个问题:

Ruby on Rails: how to get error messages from a child resource displayed?

它与您想要的类似。