2011-06-12 58 views
3

我有一个命令对象,它捕获一个带3个textareas的反馈表单。在grails域对象中验证一组字段

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语句块?

由于

回答

1

Extended Validation所述插件还增加了例如验证器,其允许以限定在几个字段约束而不定义的人工标志字段或不重复对于所涉及的每个字段中的验证支持。

+0

谢谢,该插件似乎像它解决了我一直在摔跤的事情,因为我使用webflow和cmdObjects。 – Tak 2011-06-19 22:38:57

+0

我们最初开发了这个插件来解决我们在验证大型和长期webflow中的命令对象时遇到的一些问题。 – Ruben 2011-06-20 07:44:39

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语句块中的更巧妙的办法?

这稍微更巧妙...

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

我改变了第二个块。表达式元素现在用OR(||)而不是加号(+)分隔。 – 2011-06-12 13:41:18

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 
    } 
+0

感谢您的贡献。我正在检查空值,不仅仅是因为我想避开NPE,而是因为我不希望字段本身为空。除非在isAllWhitespace()中考虑null,否则它可能是... – Tak 2011-06-19 22:40:42