Grails 条件可空验证或具有可空选项的自定义验证器

标签 grails grails-domain-class grails-2.0 grails-validation

我有一个表格来创建一个地方。根据国家/地区的不同,省(州、地区)字段是否为必填字段。

当不需要时,我想为空,而不是空字符串。我有使所有空表单字段为空的代码:

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()

现在,在 place 域中,我有一个关于该省的验证器:
province validator:  {val, obj -> if (obj.country in obj.requiresRegionCountries() && !obj.province) return [province.required]}

有了这个规则,我总是得到“省不能为空”,即使它是必需的。

我认为这是因为可空验证器默认设置为 false。

如果我添加 nullable: true,那么即使需要省,也会跳过自定义验证器,并且可以使用空省进行保存(我认为这是因为它被实例化为 null)

现在,我需要以某种方式我的自定义验证器以及在我的验证器中指定可空值的能力,如下所示:
province validator:  {val, obj -> 
  if (obj.country in obj.requiresRegionCountries() && !obj.province) { 
    nullable: false
    return [province.required] }
  else {
    nullable: true
  }
}

如何在 Grails 2.0.3 中实现这一点?

最佳答案

经过大量研究和反馈,我发现了 2 个有效的解决方案。一个是在 Controller 中。不要在模型中添加任何验证并从 Controller 动态添加它们:

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
  }

}

另一种解决方案是 Tri 在此线程中提出的解决方案,但将自定义验证器放在可空约束之前(否则不会为空值调用自定义验证器):
static constraints = {
  province (validator: {val, obj ->
    if (obj.country == 'Canada' && !val)
      return ['province.required']
  }, nullable: true)
}

关于Grails 条件可空验证或具有可空选项的自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10795482/

相关文章:

grails - 域类中的验证

database-design - Grails域可以继承吗?

多种形式的 Grails GORM

grails - Grails:在taglibs中使用actionName和pageScope.actionName有什么区别?

Grails 3.2.4, IntelliJ 2016.3.4 有一个为脚本代码生成的合成类

grails - 在grails map 中排序未在gsp中显示

spring - Spring Security如何在Grails中调用remoteFunction时重定向到登录

chalice : Difference between\${} and ${}

grails - Grails上的MVC架构

Grails:使用一个 Controller 操作同时渲染两个 View