Проверка группы полей в доменном объекте grails - PullRequest
3 голосов
/ 12 июня 2011

У меня есть командный объект, который фиксирует форму обратной связи с 3 текстовыми областями.

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

Я бы хотел убедиться, что заполнена хотя бы ОДНА из текстовых областей.

Я придумал добавить поле поддельного флага в качестве поля «ограничения», а затем выполнил кучу проверок объектов в пользовательском валидаторе для этого поля. Если после осмотра в себе, и я не могу найти то, что я хочу, я выдаю ошибку.

Прямо сейчас я делаю это:

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 ]

2 голосов
/ 14 июня 2011

Плагин Extended Validation также добавляет поддержку для валидаторов экземпляров, которые позволяют определять ограничения для нескольких полей без определения искусственного поля флага или без повторения валидатора для каждого задействованного поля.

1 голос
/ 12 июня 2011

проверить связанный / группу полей (хотя бы одно не может быть пустым, 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-операторов?

Это немного Groovier ...

if (!( (form.textarea1?.trim() ?: 0) ||
     (form.textarea2?.trim() ?: 0) ||
     (form.textarea3?.trim() ?: 0) )) {
     err.rejectValue("atLeastOne", "no.feedback")
     return false
}
0 голосов
/ 13 июня 2011

Для этого вы можете использовать плагин минимальных критериев. http://www.grails.org/plugin/min-criteria

0 голосов
/ 13 июня 2011

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
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...