我是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)仍然存在。
答案 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]]