我有一个表格来创建一个场所。 根据国家,省(州,区)域需要与否。
如果不需要,我想为null,不是空字符串。 我有代码,使所有空表单字段为空:
def newparams = [:]
place = new Place()
params.each() { k, v ->
if (v instanceof String && place.hasProperty(k)) {
if (!v.trim().length()) {
newparams[k] = null
} else {
newparams[k] = v
}
}
}
place = new Place(newparams)
place.validate()
现在,在地方领域,我对全省验证:
province validator: {val, obj -> if (obj.country in obj.requiresRegionCountries() && !obj.province) return [province.required]}
有了这个规则,我总是得到哪怕是需要与否“省不能为空”。
我想这是因为它被设置默认为false可空验证。
如果我加入可空:真,即使需要再省,自定义验证被跳过,就可以节省空省(我认为这是因为它被用空实例化)
现在,我需要以某种方式我自定义的验证,并在能力验证我指定空的,是这样的:
province validator: {val, obj ->
if (obj.country in obj.requiresRegionCountries() && !obj.province) {
nullable: false
return [province.required] }
else {
nullable: true
}
}
我怎样才能在Grails的2.0.3实现这一目标?
我不能代码告诉你贴,但如果你的问题是,默认的验证不允许省为空,你有没有尝试过明确允许省为空? 你被允许每个字段多次验证。 所以回到你原来的代码,只需指定为空的验证,以及:
province nullable: true, validator: {val, obj ->
if (obj != null && obj.country in obj.requiresRegionCountries() && !obj.province)
return [province.required]
}
编辑:在自定义的验证,可能还需要防范的obj的,如果条件是空。
EDIT2:演示项目表示对上述验证中,Grails 2.0.4工作
class Place {
String country
Province province
static constraints = {
province (nullable: true, validator: {val, obj ->
if (obj.country == 'Canada' && !val) return ['province.required']
})
}
}
控制器...
class MainController {
def index() {
def place = new Place(country: 'Canada')
if (!place.validate()) {
render "need province<br/>" + place.errors
} else {
render "cool"
}
这样的想法是,我有一个虚拟控制器,在那里我可以调用它是硬编码到创建类似的例子一个地方域实例索引操作。 请注意,我只定义了该国的字符串,所以我可以键入我的逻辑上的自定义验证。 创建放置实例时,所以它应该是空我没有定义的省。 在那种情况下,响应页面将打印以下...
输出段...
need province
grails.validation.ValidationErrors: 1 .... does not pass custom validation]
如果我删除可空:从地方真正的约束,则误差为预期的空值...
输出段...
need province
grails.validation.ValidationErrors: 1 .... cannot be null]
经过大量的调研和反馈,我发现2个解决方案的工作。 一个是控制器。 请不要在模型中添加任何验证,并从控制器动态添加它们:
class PlacesController {
def create() {
def place = new Place(params.address)
if (place.country in placesThatRequiresProvinceArray) {
place.constrains.province.nullable = false
} else {
place.constrains.province.nullable = true
}
}
另一种方案是在这个线程由三提出的一个,但把自定义的验证可空约束(其他自定义验证将不会被调用空值)之前:
static constraints = {
province (validator: {val, obj ->
if (obj.country == 'Canada' && !val)
return ['province.required']
}, nullable: true)
}
文章来源: Grails conditional nullable validation or custom validator with nullable option