如何从Grails中的inList约束中选择多个值?

时间:2014-02-25 11:59:39

标签: grails constraints multi-select grails-constraints

我是Grails的新手并且明显错过了什么......但是什么?!

我创建了一个带有String属性类别的DomainClass An。在我定义的约束中,此类别应具有多个(列表)值:

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]].

任何提示都表示赞赏。


编辑:

正如Mr.Cat所指出的,我的一个错误是将类别属性定义为String而不是List<String>。现在,所选值显示为已选中,但错误消息(default.not.inlist.message)仍然存在。

2 个答案:

答案 0 :(得分:1)

在选择框中选择多个项会导致在控制器中获得字符串列表,然后您尝试将此列表存储在单个字符串字段中,这显然是错误的,并且特别是没有通过您的costraint

答案 1 :(得分:0)

切换约束
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]]