2011-01-17 11 views
65

Tengo un modelo de ActiveRecord que está devolviendo true de valid? (y .errors está vacío), pero está devolviendo false de save(). Si la instancia del modelo es válida, ¿cómo puedo averiguar qué es lo que está causando el error de guardado?En rieles, ¿cómo puedo averiguar qué causó que falle un .save(), aparte de los errores de validación?

+7

Tuve este problema hace un par de semanas. Algunas refactorizaciones han dejado una función before_save que devuelve false todo el tiempo, lo que hace que save falle. –

+1

@Jeff - gracias, resulta que hubo un método: before_save que devuelve falso. ¿Como lo descubriste? ¿Fue solo una inspección del código? – kdt

+0

Fue la inspección del código y hacer diffs contra el control de la versión. –

Respuesta

38

comprobar todos sus devoluciones de llamada.

Tuve un problema como este y tuve el método "after_validate" que estaba fallando después de haber realizado varios cambios en el modelo. El modelo era válido pero el "after_validate" devolvía falso, así que si usé model.valid, dije verdadero, pero luego si lo guardé, me dio errores de validación (pasados ​​desde la devolución de llamada after_validate). Fue raro.

Mire el seguimiento de la aplicación y debería poder ver qué línea de código está levantando la excepción.

+2

Según el comentario de Jeff, el problema resultó ser una devolución de llamada before_save que devuelve falso. – kdt

+2

@kdt - Eso es exactamente lo que era mi problema. No había pensado en eso porque el before_save solo pretendía establecer una propiedad, pero como estaba estableciendo un valor falso, se devolvió implícitamente y eso hizo que el guardado fallara silenciosamente. El lado positivo es que ahora tengo la opción de arreglar este código agregando la línea "¡Oye, esa es mi pierna falsa!". Créalo o no, esto es importante. No es que yo haga eso;) –

+2

A nice manera de garantizar un verdadero valor de retorno es 'true.tap {do_something}' –

81

Pruebe usar la versión de bang save! (con un signo de admiración al final) e inspeccione el error resultante.

+6

+1 rápido y sucio, pero esto es siempre lo que hago – DanSingerman

+3

¡guardar! solo está lanzando un RecordNotSaved (cuando imprimo el mensaje de la excepción acabo de obtener el nombre de la clase de excepción). ¿Hay algún lugar en el que debería buscar más detalles? – kdt

+0

Si está en el modo de desarrollo Rails, debe imprimir una descripción completa del error con el seguimiento de la pila. Eche un vistazo allí para encontrar pistas y/o publicarlo aquí. –

69

Si @user.save (por ejemplo) devuelve false, a continuación, sólo ejecutar este para obtener todos los errores:

@user.errors.full_messages 
+7

Como mencioné en la pregunta, .valid? Es verdadero - es decir, no hay errores de validación. He comprobado que .errors también devuelve una lista vacía (he actualizado la pregunta para señalarlo) – kdt

2

Sí, me fijo este problema asegurándose de que vuelva cierto en toda mi before_ * devoluciones de llamada, entonces comienza a trabajar :)

0

El problema que tuve fue que me había olvidado de añadir la validación del modelo.

class ContactGroup < ActiveRecord::Base 
    validates_presence_of :name 
end 
Cuestiones relacionadas