<g:select>错误中的多个值选择

时间:2016-05-06 15:15:25

标签: grails

我尝试使用<g:select multiple='true'>为选择使用多个值,但是当我尝试将表单保存到数据库时,我收到了此错误

Property [Languages] of class [class com.Myapp.hr.EmploymentSeeker] with value [french,english] is not contained within the list [[french, english, russian, chinese]]

这是我的域名:

class EmploymentSeeker {
 Set<String> languages = [] as Set
 static hasMany = [ languages: String ]
 static constraints = {
languages(nullable:true,inList:Holders.config.languages)
 }

}

配置文件:

languages=[
'french',
'english',
'russian',
'chinese'
]

GSP:

<g:select  multiple="true" name="languages" from="${employmentSeekerInstance.constraints.languages.inList}" value="${employmentSeekerInstance?.languages}" valueMessagePrefix="empSeeker.languages" noSelection="['': '']"/>

可能导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

如Grails doc中所述:

  

inList :约束一个值,使其必须包含在给定列表中。

问题是你的 inList constrant它是一个字符串列表,但languages中的EmploymentSeeker不是字符串,它是一个设置即可。

如果它是字符串,它会起作用,例如:
'french'中包含['french','english','russian','chinese'] 但是你有设置,所以
['french']

中未包含['french','english','russian','chinese']

要使其与 inList 一起使用,您必须在约束列表中设置用户可以选择的所有组合,例如:
[['french'], ['french', 'english'], ['english', 'french'] ...]等等。
This回答描述了如何归档这些组合,但实际上它并不是一个好的解决方案,因为subsequences()并不关心排列。但是,在增加语言列表后,添加排列将以指数方式增加约束列表。

如您所见,在您的情况下,使用 inList 并不是一个好的解决方案。

我建议您实现自定义简单约束,如下所示:

languages(nullable:true,validator: {value, object ->
                Holders.config.languages.containsAll(value)​​​)​
        })

您可以阅读有关自定义约束herehere

的信息