2010-10-27 11 views

Respuesta

34

Está en lo cierto, la falla de validación aún desencadena la devolución de llamada posterior a la validación. Este es el orden de las devoluciones de llamada:

  1. before_validation
  2. after_validation
  3. before_save
  4. before_create
  5. after_create
  6. after_save
  7. after_commit

También, para comprender la cadena de eventos más grande: la documentación dice que una devolución de llamada "anterior" que devuelve falso detendrá la cadena y detendrá la acción (guardar, crear, actualizar, etc.). Una devolución de llamada "después" que devuelve falso detendrá la cadena de devoluciones de llamadas, pero no toda la acción.

"after_validation" es lo último que se ejecuta si las validaciones fallan y todo se detiene allí. Sin embargo, si pasan, todo lo demás se envuelve en una transacción de base de datos y se retrotrae si algo sale mal. Por lo tanto, su "antes_crear" puede crear un objeto hijo, por ejemplo, y se deshará con seguridad si falla la creación del objeto.

+1

¡Gracias! Tu lo has clavado. Entonces, si la after_validation devuelve false, ¿revertirá la transacción? – rafamvc

+2

¡De nada! Si after_validation devuelve false, detendrá cualquier devolución anterior/posterior, pero no detendrá la transacción. Probablemente esto se deba a que las devoluciones de llamada "anteriores" están destinadas a detectar posibles problemas, "después de" las devoluciones de llamada tienen como objetivo hacer las tareas secundarias que se deben realizar después de que un paso se haya completado con éxito. Por ejemplo, puede usar before_validation para establecer el valor predeterminado para un atributo, y si eso falla, desea detener todo el proceso. Y puede usar after_validation para actualizar un contador "failed_create" si hay algún error. –

+0

@rafamvc, si esta es la respuesta correcta, ¿por qué aceptaste la otra? – Mischa

Cuestiones relacionadas