验证grails域对象中的一组字段

时间:2011-06-12 11:04:47

标签: grails validation

我有一个命令对象,可以捕获包含3个textareas的反馈表单。

class FeedbackCommand {
    String textarea1
    String textarea2
    String textarea3
    String username 

    static constraints = {
        textarea1(nullable:true, blank:true)            
        textarea2(nullable:true, blank:true)            
        textarea3(nullable:true, blank:true)            
        username(nullable:false, blank:false)
    }
}    

我想确保至少填写一个textareas。

我想出了一个伪标志字段作为'约束'字段,然后在该字段的自定义验证器中进行一堆对象检查。如果在我自己四处寻找并且我找不到我想要的东西之后,我会抛出一个错误。

现在,我正在这样做:

class FeedbackCommand {
    String textarea1
    String textarea2
    String textarea3
    boolean atLeastOne = true
    String username 

    static constraints = {
        textarea1(nullable:true, blank:true)            
        textarea2(nullable:true, blank:true)            
        textarea3(nullable:true, blank:true) 
        atLeastOne(validator: { boolean b, FeedbackCommand form, Errors err ->
          if (b) {
            if ( (form.textarea1==null || form.textarea1?.isAllWhitespace()) &&
                 (form.textarea2==null || form.textarea2?.isAllWhitespace()) &&
                 (form.textarea3==null || form.textarea3?.isAllWhitespace()))
            {
                // They havent provided ANY feedback. Throw an error
                err.rejectValue("atLeastOne", "no.feedback")
                return false
            }
          }
          return true             
        })           
        username(nullable:false, blank:false)
    }
}

有没有更好的方法

  • 验证相关/一组字段(至少一个字段不能为空,2应该有值等)?
  • 表达“至少有一个不应该为空/空白”而不是我的严重if语句块的更加流畅的方式?

由于

4 个答案:

答案 0 :(得分:2)

Extended Validation插件还添加了对实例验证器的支持,这些验证器允许在多个字段上定义约束,而无需定义人工标志字段或不为每个涉及的字段重复验证器。

答案 1 :(得分:1)

验证相关/一组字段(至少一个字段不能为空,2应该有值等)?

试试这个:

if ( (form.textarea1?.trim() ? 1 : 0) +
     (form.textarea2?.trim() ? 1 : 0) +
     (form.textarea3?.trim() ? 1 : 0) < 2) {
     err.rejectValue("atLeastTwo", "no.feedback")
     return false
}

表达“至少有一个不应该为空/空白”而不是我的if-statement阻塞的更加流畅的方式?

这有点粗野......

if (!( (form.textarea1?.trim() ?: 0) ||
     (form.textarea2?.trim() ?: 0) ||
     (form.textarea3?.trim() ?: 0) )) {
     err.rejectValue("atLeastOne", "no.feedback")
     return false
}

答案 2 :(得分:0)

WRT验证一组字段,您可以将验证器闭包分配给其中一个字段。您不需要任何额外/虚构的字段。 如果它经常被使用,请创建一个插件 http://www.zorched.net/2008/01/25/build-a-custom-validator-in-grails-with-a-plugin/ 或使用插件进行约束 http://grails.org/plugin/constraints

关于grooviness我不是专家。但是安全导航器操作员?。没有必要要求空

if ( form.textarea1?.isAllWhitespace() &&
     form.textarea2?.isAllWhitespace() &&
     form.textarea3?.isAllWhitespace() )
     {
          // They havent provided ANY feedback. Throw an error
          err.rejectValue("atLeastOne", "no.feedback")
          return false
     }

答案 3 :(得分:0)

您可以使用min-criteria插件。 http://www.grails.org/plugin/min-criteria