ho le seguenti due (stilizzati igienizzati /) modelli:Rails Unire errori bambino con errori controllanti
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
Questi vengono chiamati dal DrivingExamController
per mezzo di:
if @driving_exam.save
L'atteso il comportamento è che il modello deve restituire false sulla convalida e unire i messaggi secondari all'hash degli errori padre e inoltrarli al controller.
Quello che succede invece è che la pagina non riesce a salvare (questo è buono) con un 422 (questo è strano) e non passa i messaggi.
Aggiungendo puts
dichiarazioni tutto il codice di cui sopra, ho stabilito che:
1) La condizione if all'interno validates_each
ha successo, e l'array record.errors
è quindi impostato all'interno del modello InvigilatorAssignment
.
2) Nel ciclo validate do
l'assegnazione sorvegliante è valido e non ha errori
3) il ciclo validate do
viene eseguito prima della validates_each
ciclo
Quindi la domanda è: come faccio a garantire che le DrivingExam
Convalida InvigilatorAssignment
e unisce i suoi messaggi di errore sul proprio hash dell'errore.
'' 'errors.add_to_base''' è stato rilasciato da Rails 3.0 e versioni successive e deve essere sostituito con: ' '' errors [: base] << "Errore studente: # {msg}" '' ' – mahatmanich