我创建了一个包含2个域的新Grails 2.5.1项目,并使用generate-all创建了脚手架。其中一个域拥有其他许多域:用户拥有多个角色。当我运行应用程序并创建新用户并为用户选择角色时,它会添加它。我可以为用户添加多个角色,或者删除它们,除了最后一个。我无法删除最后一个。如果我尝试删除用户的所有角色,则会忽略它并保留之前选择的角色。 (我在Grails 2.4.4中发现了相同的行为。)
域:
class Role {
String name
}
class User {
String name
static hasMany = [roles: Role]
}
scaffolding视图使用:
创建html选择框<g:select name="roles" from="${myapp.Role.list()}"
multiple="multiple" optionKey="id" size="5"
value="${userInstance?.roles*.id}" class="many-to-many"/>
创建这个html:
<select id="roles" class="many-to-many" size="5" multiple="multiple" name="roles">
<option selected="selected" value="1">myapp.Role : 1</option>
<option value="2">myapp.Role : 2</option>
</select>
重现:
我知道如果没有选择任何内容,则不会使用该字段的表单提交任何内容。我可以通过在绑定之前执行user.roles.clear()
来解决它。这有效,但我想知道......
脚手架真的没有设计来处理这种情况吗?或者,我做错了什么,就像我的域名编码方式一样?有没有比编辑脚手架以在绑定前清除角色更好的解决方案?
答案 0 :(得分:0)
我不确定如何取消选择角色,因为如果您在创建过程中添加了角色,则在编辑时始终至少会在表单上选择一个角色。
您必须更改脚手架视图才能实现您想要的效果。如果用户不想选择任何现有角色,请使用 g:select 的 noSelection 属性来指定默认值。
你的g:select标签就是:
<g:select name="roles" from="${myapp.Role.list()}"
noSelection="['': '--NoSelection--']"
multiple="multiple" optionKey="id" size="5"
value="${userInstance?.roles*.id}" class="many-to-many"/>
Scaffolding允许您为域类生成一些基本的CRUD接口。它不支持很多事情,你必须自己实现它们。