2010-12-28 11 views
8

Esta pregunta proviene del problema de another question de la mía. En esa pregunta, me encuentro con una situación en la que la función hasErrors() no funciona para clase de dominio no persistente, incluso después de todas las cosas que hice después de the instruction, parte 7.5.¿Cuál es la conexión entre validate() y hasErrors()

Siguiendo el camino de Victor, solucioné el problema llamando a validate(), pero no entiendo por qué funciona. Los documentos de Grails parecen no decir nada acerca de usted debe llamar a una función validate() before hasErrors(). ¿Cómo pudo pasar esto?

Respuesta

9

Tiene sentido para mí que tendría que ser llamado antes de pedir un objeto validate si hasErrors (o save de objetos de dominio apropiadas, lo que exige validate bajo las sábanas). Validar en este contexto significa "verificar si este objeto es válido e indicar cualquier error si no es así".

Alternativamente, la implementación GORM debería llamar al validate cada vez que se realiza un cambio en un objeto, lo que para mí sería un comportamiento menos deseable, ya que podría implicar mucho trabajo frecuente e innecesario (algunas de esas restricciones podrían implica mucho trabajo).

El comienzo de la sección 7.2 indica bastante claramente "Para validar una clase de dominio puede llamar al método de validación en cualquier instancia". También establece que "dentro de Grails hay esencialmente 2 fases de validación, la primera fase es el enlace de datos que se produce cuando vincula los parámetros de solicitud a una instancia como ... En este punto, es posible que ya tenga errores en la propiedad de errores debido a tipo de conversión (como convertir cadenas en fechas). Puede verificarlas y obtener el valor de entrada original usando la API de errores. ... La segunda fase de validación ocurre cuando se llama a validar o guardar. Esto es cuando Grails validará el límite valores contradice las restricciones que definió ".

El documentation for hasErrors también lo menciona. Puede acceder a esto buscando la llamada al método en el cuadro de navegación de la izquierda, cuando se encuentre en el documentation site. Siempre recomendaría buscar en estas y en las páginas más descriptivas de la guía del usuario, ya que a menudo ofrecen un poco más de detalle. Here's the page for the validate method también.

Nunca he tenido un problema al llamar directamente al validate; es muy claro para mí y puedo elegir el punto donde todo el trabajo está hecho y estoy listo para que la validación tenga lugar. No puedo ver una opción para cambiar este comportamiento en cualquier lugar, pero si quería llamar al validate automáticamente o bajo ciertas condiciones, tal vez podría usar algo de magia de programación meta Groovy añadiendo invokeMethod a la clase y hacer que llame al validate antes de pasar ciertas llamadas en. Eche un vistazo here y here. (¡Aunque no estoy seguro de que lo recomiende! Y tenga en cuenta que su clase ahora dependería de su uso dentro del marco de validación GORM, ya que de lo contrario no existiría el método validate).

+0

Muchas gracias por su respuesta cuidadosa, lo entiendo ahora. –

+2

Por cierto ... Peter Ledbrook (uno de los autores del excelente libro Grails in Action) ha escrito una gran serie de artículos sobre GORM Gotchas, que vale la pena leer para conocer algunos de los detalles de cómo todo esto funciona: [parte 1] (http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/), [parte 2] (http://blog.springsource.com/2010/ 07/02/gorm-gotchas-part-2 /) y [parte 3] (http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). –

Cuestiones relacionadas