0

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

任何提示表示赞赏。


编辑:

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

4

2 回答 2

1

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

于 2014-02-25T15:34:44.830 回答
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]]
于 2014-02-26T15:29:34.353 回答