2010-12-28 13 views
8

Questa domanda deriva dal problema di another question. In questa domanda, mi imbatto in una situazione in cui la funzione hasErrors() non funziona per la classe di dominio non persistente , anche dopo tutto ciò che ho fatto dopo the instruction, parte 7.5.Qual è la connessione tra validate() e hasErrors()

Seguendo la strada di Victor, ho risolto il problema chiamando validate(), ma non capisco perché funzioni. I documenti Grails sembrano non dire nulla su di te dovrebbe chiamare un validate() prima della funzione hasErrors(). Come è potuto accadere?

risposta

9

ha senso per me che validate avrebbe bisogno di essere chiamato prima di chiedere un oggetto che si tratti hasErrors (o save per oggetti di dominio corretto, che invita validate sotto le coperte). Convalidare in questo contesto significa "verificare se questo oggetto è valido e indicare eventuali errori se non".

In alternativa, l'implementazione GORM dovrebbe chiamare validate ogni volta che viene apportata una modifica a un oggetto, che per me sarebbe un comportamento meno desiderabile, in quanto potrebbe comportare un sacco di lavoro svolto spesso e inutilmente (alcuni di questi limiti potrebbero coinvolge molto lavoro).

L'inizio della sezione 7.2 indica chiaramente "Per convalidare una classe di dominio è possibile chiamare il metodo di convalida su qualsiasi istanza". Dichiara inoltre che "all'interno di Grails ci sono essenzialmente 2 fasi di validazione, la prima fase è l'associazione dei dati che si verifica quando si associano i parametri di richiesta a un'istanza come ... A questo punto potresti già avere errori nella proprietà degli errori a causa di conversione di tipi (come la conversione di stringhe in date). È possibile controllarli e ottenere il valore di input originale utilizzando l'API Errors. ... La seconda fase di convalida avviene quando si chiama validate o save. Questo è quando Grails convaliderà il limite i valori ripristinano i vincoli che hai definito. "

Anche lo documentation for hasErrors menziona questo. È possibile accedere a questo trovando la chiamata al metodo nel riquadro di navigazione sulla sinistra, quando si è nello documentation site. Consiglierei sempre di guardare a queste pagine e alle pagine guida per l'utente più descrittive, dato che spesso danno un po 'più di dettagli. Here's the page for the validate method troppo.

Non ho mai avuto un problema chiamando direttamente validate - è molto chiaro a me e mi può scegliere il punto in cui è fatto tutto il lavoro e sono pronto per la convalida di prendere posto. Non riesco a vedere un'opzione per cambiare questo comportamento da nessuna parte, ma se vuoi che validate venga chiamato automaticamente o in determinate condizioni, potresti forse usare qualche magia di programmazione Meta groovy aggiungendo forse invokeMethod alla classe e chiamarla validate prima di passare alcune chiamate. Dai uno sguardo allo here e allo here. (Non sono sicuro che lo consiglierei comunque! E tenete a mente che la vostra classe ora dipenderebbe dall'essere utilizzata all'interno del framework di validazione GORM, poiché il metodo validate potrebbe non esistere altrimenti).

+0

Mille grazie per la tua risposta attenta, lo capisco ora. –

+2

A proposito ... Peter Ledbrook (uno degli autori dell'eccellente libro di Grails in Action) ha scritto una grande serie di articoli sui Gotcha di GORM - vale la pena leggerlo per avere un'idea di alcuni dettagli di come tutto questo funziona: [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 /) e [parte 3] (http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). –

Problemi correlati