Question

I want to ensure that one of two form fields representing a boolean value is checked. But there is no appropriate constraint to do this. nullable: false does not work.

class Organisation {

    Boolean selfInspecting

    static constraints = {
        selfInspecting(nullable: false)
    }

}

How can I check whether one of the two fields is checked or not?

Was it helpful?

Solution

You can also check this in the Controller, e.g.

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

OTHER TIPS

Perhaps the simplest approach is to use a form that ensures a value is picked. As such, creating a radio buttons rather than checkboxes is a better solution. It would directly represent your intent as well.

you can write your own custom validator.

something like

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

EDIT -- in response to the other answer -- you can handle this on the form, but you should also handle it on the server.

ANOTHER EDIT -- It was suggested in a comment that you might want to validate one of two fields on your Domain class. This is also easily accomplished with a custom validator. With the signature above for the custom validator closure, the val is the value selfInspecting, and obj is the domain object instance. So you could have

{ 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

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top