2011-11-04 15 views
15

En este momento, por lo que sé, se llamará a after_validation incluso si el modelo no supera las validaciones. ¿Hay alguna manera de llamarlo solo si el modelo es válido? Intenté agregar return false unless self.valid? en el método after_validation pero eso activa la validación nuevamente y crea un ciclo infinito.Ruby on Rails: ¿validez después de la validez?

+2

Bueno, podrías buscar 'errors', como' return false a menos que self.errors.empty? 'O' return false if errors.any? '. – tbuehlmann

Respuesta

16

Las validaciones fallan añadir a los errores para el registro, por lo que sólo podría comprobar:

return false unless self.errors.empty? 
+0

He intentado esto antes y todavía falló. Luego revisé el código y noté que estaba llamando a la validación de nuevo (cuando se suponía que no debía). Ahora funciona perfecto. ¡Gracias! –

2

¿Ha pensado en utilizar la devolución de llamada before_save en su lugar?

Creo que solo se llamará si el objeto es válido.

+2

¿Qué sucede si no quiero guardarlo? Solo quiero validarlo? –

+1

Tampoco puede hacer cosas más avanzadas en 'before_save' como comprobar qué campos han cambiado en una asociación (mediante' xxx_changed? ') Ya que las asociaciones se actualizan primero, restableciendo así el hash' changed'. Como tal, es necesario realizar estas comprobaciones en 'after_validation' como una solución alternativa. –

0

Sé que esto es una vieja pregunta, pero me encontré con el mismo error cuando se utiliza una validación personalizada en un modelo Yo había creado. Mirando el docs hay una parte que cubre los métodos personalizados e indica que tales validaciones son llamadas cada vez que el método .valid?. Esa es probablemente la razón por la cual el ciclo infinito se activó cuando se activó la devolución de llamada :after_validation.