Validation 如何确保在Grails中设置布尔字段?

Validation 如何确保在Grails中设置布尔字段?,validation,grails,boolean,nullable,grails-domain-class,Validation,Grails,Boolean,Nullable,Grails Domain Class,我希望确保选中表示布尔值的两个表单字段之一。但这样做没有适当的限制可为空:false不起作用 class Organisation { Boolean selfInspecting static constraints = { selfInspecting(nullable: false) } } 如何检查这两个字段中是否有一个被选中?也许最简单的方法是使用一个表单来确保选择值。因此,创建单选按钮而不是复选框是更好的解决方案。它也将直接代表您的意图

我希望确保选中表示布尔值的两个表单字段之一。但这样做没有适当的限制<代码>可为空:false不起作用

class Organisation {

    Boolean selfInspecting

    static constraints = {
        selfInspecting(nullable: false)
    }

}

如何检查这两个字段中是否有一个被选中?

也许最简单的方法是使用一个表单来确保选择值。因此,创建单选按钮而不是复选框是更好的解决方案。它也将直接代表您的意图。

也许最简单的方法是使用一个表单来确保选择值。因此,创建单选按钮而不是复选框是更好的解决方案。它也将直接代表您的意图。

您可以编写自己的自定义验证器

差不多

selfInspecting(validator: {val, obj -> /*test selfInspecting here*/})
EDIT——作为对另一个答案的响应——您可以在表单上处理它,但也应该在服务器上处理它

另一个编辑——在一条评论中建议您可能需要验证域类上的两个字段之一。这也可以通过自定义验证器轻松完成。对于上面的自定义验证器闭包签名,val是值selfinspection,obj是域对象实例。所以你本来可以

{ 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

}

您可以编写自己的自定义验证器

差不多

selfInspecting(validator: {val, obj -> /*test selfInspecting here*/})
EDIT——作为对另一个答案的响应——您可以在表单上处理它,但也应该在服务器上处理它

另一个编辑——在一条评论中建议您可能需要验证域类上的两个字段之一。这也可以通过自定义验证器轻松完成。对于上面的自定义验证器闭包签名,val是值selfinspection,obj是域对象实例。所以你本来可以

{ 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

}

您也可以在控制器中对此进行检查,例如

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

您也可以在控制器中对此进行检查,例如

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

此外,复选框表示多个布尔值。根据您的示例,我只希望看到一个复选框或带有yes/no选项的广播组。您还可以在域中设置selfinspection=true | false,以便无论发生什么情况,它都有一个默认值而不是null。或者使用默认为false的基本布尔值。我想使用单选按钮,但我不想预选一个,因为用户可能会意外地接受我的预选。此外,复选框表示多个布尔值。根据您的示例,我只希望看到一个复选框或带有yes/no选项的广播组。您还可以在域中设置selfinspection=true | false,以便无论发生什么情况,它都有一个默认值而不是null。或者使用默认为false的基本布尔值。我想使用单选按钮,但不想预选一个,因为用户可能会意外地接受我的预选。如果将SelfInspection设置为默认值或使用基本布尔值,则无需自定义验证。@gregg,控制器/服务代码不能(意外地)如果使用布尔对象,而不是原语,我想他们可以将值置空。但这也可能发生在验证之后,因此测试是这里的关键@gregg我相信所有保存/更新方法都会在启动时进行验证。此外,与我们讨论这一点时编写的代码相比,验证程序的代码行更少,因此可以实现和测试。海报还希望检查两个字段中的一个是否已检查,即a | b==true。服务器端肯定需要验证程序来确保这一点。如果您将自检设置为默认值或使用基本布尔值,则无需进行自定义验证。@gregg,控制器/服务代码不能(意外地)使该值无效?如果使用布尔对象而不是基本值,我想他们可以。但这也可能发生在验证之后,因此测试是这里的关键@gregg我相信所有保存/更新方法都会在启动时进行验证。此外,与我们讨论这一点时编写的代码相比,验证程序的代码行更少,因此可以实现和测试。海报还希望检查两个字段中的一个是否已检查,即a | b==true。服务器端肯定需要验证器来确保这一点。