2010-11-18 4 views
1

Ich möchte sicherstellen, dass eines von zwei Formularfeldern, die einen booleschen Wert darstellen, überprüft wird. Aber dafür gibt es keine angemessene Einschränkung. nullable: false funktioniert nicht.Wie kann man sicherstellen, dass ein boolesches Feld in Grails gesetzt wird?

class Organisation { 

    Boolean selfInspecting 

    static constraints = { 
     selfInspecting(nullable: false) 
    } 

} 

Wie kann ich prüfen, ob eines der beiden Felder aktiviert ist oder nicht?

Antwort

2

Sie können dies auch in der Steuerung überprüfen, z.

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

Der vielleicht einfachste Ansatz besteht darin, ein Formular zu verwenden, das sicherstellt, dass ein Wert ausgewählt wird. Daher ist das Erstellen von Optionsfeldern anstelle von Kontrollkästchen eine bessere Lösung. Es würde direkt Ihre Absicht auch darstellen.

+0

Darüber hinaus stellen die Kontrollkästchen mehrere boolesche Werte dar. Für Ihr Beispiel würde ich nur ein einzelnes Kontrollkästchen oder eine Radiogruppe mit Ja/Nein-Optionen erwarten. Sie können auch selfInspecting = true | false in Ihrer Domain, so dass es einen anderen Standardwert als null hat, egal was passiert. Oder verwenden Sie den primitiven Booleschen Wert, der standardmäßig auf false gesetzt ist. – Gregg

+0

Ich möchte Radioknöpfe verwenden, aber ich möchte nicht eine vorwählen, weil Benutzer meine die Vorwahl versehentlich annehmen konnten. – deamon

1

können Sie Ihren eigenen benutzerdefinierten Validator schreiben.

so etwas wie

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

EDIT - als Reaktion auf die andere Antwort - Sie können dies auf dem Formular handhaben, aber man sollte es auch auf dem Server bearbeiten.

ANDERES BEARBEITEN - In einem Kommentar wurde vorgeschlagen, dass Sie eines von zwei Feldern in Ihrer Domain-Klasse validieren möchten. Dies kann auch leicht mit einem benutzerdefinierten Validator erreicht werden. Bei der obigen Signatur für den benutzerdefinierten Validatorabschluss ist val der Wert selfInspecting und obj die Domänenobjektinstanz. So könnten Sie haben

{ 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

Wenn Sie selfInspecting auf einen Standardwert setzen oder den primitiven booleschen Wert verwenden, ist keine benutzerdefinierte Überprüfung erforderlich. – Gregg

+0

@gregg, Controller/Service-Code kann nicht (versehentlich) den Wert null? – hvgotcodes

+0

Ich nehme an, sie können, wenn sie das Boolean-Objekt verwenden, und nicht das Primitive. Aber das kann auch nach der Validierung passieren, also ist Testen hier der Schlüssel. ;) – Gregg

Verwandte Themen