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?
Respuesta
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.
Según el comentario de Jeff, el problema resultó ser una devolución de llamada before_save que devuelve falso. – kdt
@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;) –
A nice manera de garantizar un verdadero valor de retorno es 'true.tap {do_something}' –
Pruebe usar la versión de bang save!
(con un signo de admiración al final) e inspeccione el error resultante.
+1 rápido y sucio, pero esto es siempre lo que hago – DanSingerman
¡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
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í. –
Si @user.save
(por ejemplo) devuelve false
, a continuación, sólo ejecutar este para obtener todos los errores:
@user.errors.full_messages
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
Sí, me fijo este problema asegurándose de que vuelva cierto en toda mi before_ * devoluciones de llamada, entonces comienza a trabajar :)
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
- 1. ¿Cómo puedo determinar qué tipo de UIControlEvents causó un UIEvent?
- 2. ¿Cómo encontrar qué causó los errores informados en un seguimiento del generador de perfiles de SQL Server?
- 3. SQL Server: Averigüe lo que causó la fila TSQL falle (SSIS)
- 4. Cómo puedo detener los errores de validación de CSS que aparecen en la Lista de errores en VS2008
- 5. & nbsp hace que falle la validación de HTML5
- 6. Cómo marcar los campos en los carriles errores de validación
- 7. validación de los rieles sobre el redireccionamiento
- 8. ¿Cómo puedo mostrar los errores de validación de entrada de CakePHP en un lugar diferente?
- 9. ¿Cómo saber qué UITextField causó un UIKeyboardWillShowNotification?
- 10. Validación de WPF: Borrado de todos los errores de validación
- 11. Cómo personalizar los errores de validación de formulario en codeIgniter
- 12. ¿Cómo se borran los errores de validación en Eclipse?
- 13. ¿Cómo puedo averiguar qué bibliotecas usa un exe de Windows?
- 14. Rieles: Excepción en after_create stopping save
- 15. Validación en rieles sin modelo
- 16. Contexto de validación de rieles
- 17. validación dinámica de rieles
- 18. ¿Cómo puedo mostrar errores en la validación jQuery?
- 19. Los rieles anulan el mensaje de validación
- 20. Rieles: Deshacerse de los errores de validación genéricos "X no es válido"
- 21. Validación y solución de errores en CQRS
- 22. Los rieles ponen la validación en un módulo mixin?
- 23. ¿Qué motivos pueden hacer que ShellExecute falle?
- 24. ¿Qué señal de teclado aparte de Ctrl-C puedo capturar?
- 25. Validación ErrorTemplate no aparece en los errores de datos
- 26. Rieles validación de que un valor no es igual a
- 27. ¿Cómo hacer que python falle con elegancia?
- 28. ResourceDictionary en un ensamblado aparte
- 29. Cómo entender los errores del punto de acceso de Java
- 30. ¿Determinar qué causó LayoutUpdate/ArrangeOverride?
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. –
@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
Fue la inspección del código y hacer diffs contra el control de la versión. –