Grails 2.5 脚手架在绑定期间不会删除最后一个 hasMany
Grails 2.5 scaffolding does not remove last hasMany during bind
我创建了一个包含 2 个域的新 Grails 2.5.1 项目,并使用 generate-all 来创建脚手架。其中一个域具有许多其他域:用户具有许多角色。当我 运行 应用程序并创建一个新用户和 select 用户角色时,它会添加它。我可以为用户添加多个角色,或者删除它们,最后一个除外。我无法删除最后一个。如果我尝试删除用户的所有角色,它会忽略它并保留之前 selected 的角色。 (我在 Grails 2.4.4 中发现了相同的行为。)
域:
class Role {
String name
}
class User {
String name
static hasMany = [roles: Role]
}
脚手架视图创建 html select 框:
<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>
重现:
- 运行 应用
- 创建几个角色
- 创建新用户,输入名称,select一个或多个角色,然后单击创建
- 编辑用户,取消select角色,然后点击更新
- 请注意,之前的角色仍然selected
我明白,如果没有 selected,则该字段的表单不会提交任何内容。我可以通过在绑定之前执行 user.roles.clear()
来修复它。这行得通,但我想知道...
脚手架真的不是为处理这种情况而设计的吗?或者,我做错了什么,比如我的域名编码方式?有没有比编辑脚手架在绑定前清除角色更好的解决方案?
我不确定您如何取消select角色,因为如果您在创建过程中添加了角色,那么在编辑时至少会在表单上select编辑一个角色。
您必须更改脚手架视图才能实现您想要的效果。使用 noSelection 属性 of g:select 来指定默认值25=] 任何现有角色。
您的 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"/>
并且脚手架允许您为域生成一些基本的 CRUD 界面 class。它不支持很多东西,你必须自己实现它们。
我创建了一个包含 2 个域的新 Grails 2.5.1 项目,并使用 generate-all 来创建脚手架。其中一个域具有许多其他域:用户具有许多角色。当我 运行 应用程序并创建一个新用户和 select 用户角色时,它会添加它。我可以为用户添加多个角色,或者删除它们,最后一个除外。我无法删除最后一个。如果我尝试删除用户的所有角色,它会忽略它并保留之前 selected 的角色。 (我在 Grails 2.4.4 中发现了相同的行为。)
域:
class Role {
String name
}
class User {
String name
static hasMany = [roles: Role]
}
脚手架视图创建 html select 框:
<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>
重现:
- 运行 应用
- 创建几个角色
- 创建新用户,输入名称,select一个或多个角色,然后单击创建
- 编辑用户,取消select角色,然后点击更新
- 请注意,之前的角色仍然selected
我明白,如果没有 selected,则该字段的表单不会提交任何内容。我可以通过在绑定之前执行 user.roles.clear()
来修复它。这行得通,但我想知道...
脚手架真的不是为处理这种情况而设计的吗?或者,我做错了什么,比如我的域名编码方式?有没有比编辑脚手架在绑定前清除角色更好的解决方案?
我不确定您如何取消select角色,因为如果您在创建过程中添加了角色,那么在编辑时至少会在表单上select编辑一个角色。
您必须更改脚手架视图才能实现您想要的效果。使用 noSelection 属性 of g:select 来指定默认值25=] 任何现有角色。
您的 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"/>
并且脚手架允许您为域生成一些基本的 CRUD 界面 class。它不支持很多东西,你必须自己实现它们。