2010-11-18 2 views
1

Je veux m'assurer que l'un des deux champs de formulaire représentant une valeur booléenne est vérifié. Mais il n'y a pas de contrainte appropriée pour le faire. nullable: false ne fonctionne pas.Comment faire en sorte qu'un champ booléen soit défini dans Grails?

class Organisation { 

    Boolean selfInspecting 

    static constraints = { 
     selfInspecting(nullable: false) 
    } 

} 

Comment puis-je vérifier si l'un des deux champs est coché ou non?

Répondre

2

Vous pouvez également vérifier dans le contrôleur, par exemple

if (params.checkBox1 != 'on' && params.checkBox2 != 'on') 
    flash.error = 'At least one value must be checked.' 
    return ... 
3

L'approche la plus simple consiste peut-être à utiliser un formulaire qui garantit qu'une valeur est sélectionnée. En tant que tel, créer une radio boutons plutôt que des cases à cocher est une meilleure solution. Cela représenterait directement votre intention également.

+0

En outre, les cases à cocher représentent plusieurs valeurs booléennes. Par votre exemple, je m'attendrais seulement à voir une case à cocher unique ou un groupe de radio avec des options oui/non. Vous pouvez également définir selfInspecting = true | false dans votre domaine afin qu'il ait une valeur par défaut autre que null quoi qu'il arrive. Ou utilisez le booléen primitif dont la valeur par défaut est false. – Gregg

+0

Je veux utiliser des boutons radio, mais je ne veux pas en présélectionner un, car les utilisateurs pourraient accidentellement accepter ma présélection. – deamon

1

vous pouvez écrire votre propre validateur personnalisé.

quelque chose comme

selfInspecting(validator: {val, obj -> /*test selfInspecting here*/}) 

EDIT - en réponse à l'autre réponse - vous pouvez gérer cela sur la forme, mais vous devez également gérer sur le serveur.

AUTRE EDIT - Il a été suggéré dans un commentaire que vous souhaitiez valider l'un des deux champs de votre classe Domain. Ceci est également facilement accompli avec un validateur personnalisé. Avec la signature ci-dessus pour la fermeture du validateur personnalisé, val est la valeur selfInspecting, et obj est l'instance de l'objet du domaine. Donc, vous pourriez avoir

{ val, obj -> 

    if (val == null) return false // if you want to ensure selfInspecting is not null 
    else return true 

    ... or ... 

    // if you want to check that at least 1 of two fields is not null 
    def oneOrTheOther = false 
    if (obj.field1 != null || obj.field2 != null) 
     oneOrTheOther = true 
    return oneOrTheOther 

} 
+0

Si vous définissez selfInspecting sur une valeur par défaut ou utilisez le booléen primitif, vous n'avez pas besoin de validation personnalisée. – Gregg

+0

@gregg, les contrôleurs/code de service ne peuvent pas (accidentellement) annuler la valeur? – hvgotcodes

+0

Je suppose qu'ils peuvent, si vous utilisez l'objet booléen, et non le primitif. Mais cela peut aussi arriver après la validation, donc le test est la clé ici. ;) – Gregg

Questions connexes