Как выбрать несколько значений из ограничения inList в Grails?

Я новичок в Grails и, очевидно, что-то упустил.. но что?!

Я создал DomainClass An с категорией свойства String. В ограничениях, которые я определил, эта категория должна иметь несколько (список) значений:

class An {
 String category
 static constraints = {
  category nullable: true, inList:["do", "me", "a", "favour"]  
 }
}

В представлении это отображается как поле множественного выбора:

<g:select name="category" from="${anInstance.constraints.category.inList}" 
          value="${anInstance?.category}" 
          valueMessagePrefix="a.category"
          noSelection="${['': 'Please select one ...'}"
          multiple="multiple" size="5"/>

Метод сохранения является стандартным:

def save = {
 def anInstance = new An(params)
  if (anInstance.save(flush: true)){
        flash.message = "${message(..)}"
        redirect(action: "show", id: anInstance.id)
    } else {
        render(view: "create", model: [anInstance: anInstance])
    }
}

Когда я выбираю / сохраняю только одно значение, оно выбирается / отображается / сохраняется как ожидалось. Когда я хочу выбрать / сохранить много значений из этого списка, я получил сообщение о том, что выбранных значений нет в списке (default.not.inlist.message):

Property [category] of class [class An] with value [do, me, a, favour] is not contained within the list [[do, me, a, favour]].

Любая подсказка приветствуется.


РЕДАКТИРОВАТЬ:

Как отметил г-н Кэт, одной из моих ошибок было определение свойства категории как String и не List<String>, Теперь выбранные значения отображаются как выбранные, но сообщение об ошибке (default.not.inlist.message) по-прежнему остается.

2 ответа

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

Переключите ваше ограничение с

category nullable: true, inList:["do", "me", "a", "favour"]

в

category nullable: true, inList: (["do", "me", "a", "favour"].subsequences() as List)

Это сгенерирует следующее, которое должно охватывать все ваши базы:

[[do, me, a, favour], [a, favour], [a], [me, a, favour], [do, a], [do, me, a], [do, a, favour], [me], [favour], [do, me, favour], [do, me], [me, favour], [do], [me, a], [do, favour]]
Другие вопросы по тегам