Grails проверка списка объектов - PullRequest
4 голосов
/ 24 июня 2009

Я пытаюсь получить grails для проверки содержимого списка объектов, может быть проще, если я сначала покажу код:

class Item {
  Contact recipient = new Contact()
  List extraRecipients = [] 

  static hasMany = [
          extraRecipients:Contact
  ]

  static constraints = {}

  static embedded = ['recipient']
}

class Contact {
  String name
  String email

  static constraints = {
    name(blank:false)
    email(email:true, blank:false)
  }
}    

По сути, у меня есть один требуемый контакт («получатель»), он прекрасно работает:

def i = new Item()
// will be false
assert !i.validate() 
// will contain a error for 'recipient.name' and 'recipient.email'
i.errors 

Что я хотел бы также сделать, это проверить любой из прикрепленных Contact объектов в 'extraRecipients' так, чтобы:

def i = new Item()
i.recipient = new Contact(name:'a name',email:'email@example.com')

// should be true as all the contact's are valid
assert i.validate() 

i.extraRecipients << new Contact() // empty invalid object

// should now fail validation
assert !i.validate()

Возможно ли это, или мне просто нужно перебрать коллекцию в моем контроллере и вызвать validate() для каждого объекта в extraRecipients?

1 Ответ

8 голосов
/ 25 июня 2009

Если я правильно понял вопрос, вы хотите, чтобы ошибка появилась в объекте предметной области (как ошибка для свойства extraRecipients, вместо того, чтобы позволить каскадному сохранению выдать ошибку проверки для отдельных элементов Contact в extraRecipients, право

Если это так, вы можете использовать пользовательский валидатор в ограничениях вашего предмета. Примерно так (это не было проверено, но должно быть близко):

static constraints = {
    extraRecipients( validator: { recipients ->
        recipients.every { it.validate() } 
    } )
}

Вы можете получить причудливее, чем с сообщением об ошибке, чтобы потенциально указать в результирующей строке ошибки, какой получатель потерпел неудачу, но это основной способ сделать это.

...