我有一个命令对象,可以捕获包含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)
}
}
有没有更好的方法
由于
答案 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