2010-01-28 8 views
4

En version 1.2, Grails a introduit des contraintes globales. J'ai essayé d'ajouter ce qui suit à Config.groovyContraintes contraintes globales

grails.gorm.default = { 

    constraints { 
     notBlank(nullable:false, blank:false) 
    } 
} 

Ensuite, en utilisant dans une de mes classes de domaine

static constraints = { 
    email(email: true, unique: true, shared: 'notBlank') 
} 

Mais lorsque j'enregistre un utilisateur avec une adresse e-mail null, aucune des erreurs sont signalées , Pourquoi?

Merci, Don

Répondre

6

Je n'ai jamais essayé de faire des contraintes globales, mais je peux vous dire que si vous voulez marquer un champ comme pas vide et non nullable vous n'avez pas besoin de créer une nouvelle contrainte du tout, il suffit d'ajouter ceci à votre classe de domaine:

static constraints = { 
    email(blank:false) 
} 

Bien sûr, si vous vous attendez à une exception, sauf vous n'obtenir un - vous devez tester l'objet après avoir appelé save() ou valider() comme démontré dans cette classe de domaine:

class Contact { 
    static constraints = { 
     name(blank:false) 
    } 
    String name 
} 

et son cas de test:

import grails.test.* 

class ContactTests extends GrailsUnitTestCase { 
    protected void setUp() { 
     super.setUp() 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testNameConstraintNotNullable() { 
     mockDomain Contact 
     def contact = new Contact() 
     contact.save() 
     assertTrue contact.hasErrors() 
     assertEquals "nullable", contact.errors["name"] 
    } 
} 

Si vous ne souhaitez exceptions lors de l'enregistrement, vous pouvez ajouter ce paramètre dans votre Config.groovy:

grails.gorm.save.failOnError = true 

Je l'ai trouvé tout à fait utile dans développement.

HTH

PS

Pour utiliser une contrainte que vous vous avez défini auriez besoin d'ajouter ceci à votre classe de domaine:

static constraints = { 
    email(shared:"myConstraintName") 
} 

Mais attention, vous ne pouvez pas tester la contrainte dans un test unitaire comme vous le feriez dans ceux intégrés car la config n'aura pas été lue.

+0

Merci pour le conseil de ne pas être en mesure de tester les contraintes globales - ne le savais pas. BTW, pourquoi ne voudriez-vous pas que failOnError soit également activé? –

+0

Je le garde désactivé de sorte que le comportement par défaut est d'échouer discrètement à un fichier journal plutôt que d'afficher une grosse trace de pile sur l'écran de l'utilisateur. Il y a d'autres façons d'y parvenir bien sûr et vous aurez probablement votre propre écran d'erreur 500 configuré de toute façon, donc je suppose que la réponse est la préférence personnelle. –

2

Si vous voulez la contrainte par défaut appliquée à toutes les propriétés est devrait être:

grails.gorm.default = { 
    constraints { 
     '*'(nullable:false, blank:false) 
    } 
} 

Si vous voulez nommer la contrainte, vous appliqueriez à votre domaine propriété de classe de courrier électronique en utilisant le partagé clé :

static constraints = { 
    email(email: true, unique: true, shared: "notBlank") 
} 

La valeur par défaut dans Grails est de ne pas permettre à des propriétés null, donc blanc: false est tout ce que vous avez vraiment besoin (c.-à-global par défaut défini dans ce CAS e n'est pas nécessaire).