2010-11-18 57 views
1

我想确保代表布尔值的两个表单字段中的一个被选中。但是没有适当的限制来做到这一点。 nullable: false不起作用。如何确保在Grails中设置布尔型字段?

class Organisation { 

    Boolean selfInspecting 

    static constraints = { 
     selfInspecting(nullable: false) 
    } 

} 

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

回答

2

你也可以在控制器中检查这个,例如,

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

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

+0

此外,复选框表示多个布尔值。根据你的例子,我只希望看到一个复选框或一个有/无选项的收音机组。你也可以设置selfInspecting = true |在您的域名中为false,以便无论发生什么,它都具有非null的默认值。或者使用默认为false的原始布尔值。 – Gregg 2010-11-18 16:45:28

+0

我想使用单选按钮,但我不想预选一个,因为用户可能会不小心接受我的预选。 – deamon 2010-11-18 16:53:23

1

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

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

编辑 - 响应对方的回答 - 你可以在表格上处理这个问题,但你也应该处理它的服务器上。

另一编辑 - 在评论中建议您可能要验证Domain类中两个字段中的一个。这也可以通过自定义验证器轻松完成。通过上面的自定义验证器闭包的签名,val是值selfInspecting,而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 

} 
+0

如果将selfInspecting设置为默认值或使用基本布尔值,则不需要自定义验证。 – Gregg 2010-11-18 16:52:46

+0

@gregg,控制器/服务代码不能(意外)将该值清空? – hvgotcodes 2010-11-18 17:04:22

+0

我想他们可以,如果使用布尔对象,而不是原语。但是这也可能在验证之后发生,因此测试是关键。 ;) – Gregg 2010-11-18 17:33:59

相关问题