2011-11-04 13 views
15

In questo momento, da quello che so, verrà chiamato after_validation anche se il modello non supera le convalide. C'è un modo per chiamarlo solo se il modello è valido? Ho provato ad aggiungere return false unless self.valid? nel metodo after_validation ma questo innesca di nuovo la convalida e crea un ciclo infinito.Ruby on Rails - after_validation se valido?

+2

Bene, è possibile controllare "errori", come "return false a meno che self.errors.empty?" O "return false if errors.any?". – tbuehlmann

risposta

16

Le convalide mancanza aggiungono agli errori per il record, quindi si può solo controllare:

return false unless self.errors.empty? 
+0

Ho già provato questo e ancora non è riuscito. Poi ho controllato il codice e ho notato che stavo chiamando di nuovo la convalida (quando non dovevo). Ora funziona perfettamente. Grazie! –

2

Hai mai pensato di utilizzare il callback before_save?

Credo che verrà chiamato solo se l'oggetto è valido.

+2

Cosa succede se non desidero salvarlo? Voglio solo convalidarlo? –

+1

Non puoi anche fare cose più avanzate in 'before_save' come controllare quali campi sono cambiati in un'associazione (tramite' xxx_changed? ') Poiché le associazioni vengono aggiornate per prime, ripristinando così l'hash' cambiato '. Pertanto, è necessario eseguire questi controlli in 'after_validation' come soluzione alternativa. –

0

So che questa è una vecchia questione, ma mi sono imbattuto nello stesso errore quando si utilizza una convalida personalizzato su un modello L'avevo creato Guardando il docs c'è una parte che copre i metodi personalizzati e afferma che tali convalide vengono chiamate ogni volta il metodo .valid?. Questo è probabilmente il motivo per cui il ciclo infinito è stato attivato quando è stata attivata la richiamata :after_validation.