Grails 2.5 脚手架在绑定(bind)期间不会删除最后一个 hasMany

标签 grails scaffolding grails-2.5

我创建了一个具有 2 个域的新 Grails 2.5.1 项目,并使用 generate-all 创建脚手架。其中一个域具有许多其他域:用户具有许多角色。当我运行该应用程序并创建一个新用户并为该用户选择一个角色时,它会添加它。我可以为一个用户添加多个角色,或者删除它们,除了最后一个。我不能删除最后一个。如果我尝试删除用户的所有角色,它会忽略它并保留之前选择的角色。 (我在 Grails 2.4.4 中发现了相同的行为。)

域:

class Role {
    String name
}

class User {
    String name
    static hasMany = [roles: Role]
}

脚手架 View 创建 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() 来修复它绑定(bind)前。这行得通,但我想知道......

    脚手架真的不是为处理这种情况而设计的吗?或者,我做错了什么,比如我的域编码方式?有没有比在绑定(bind)之前编辑脚手架以清除角色更好的解决方案?

    最佳答案

    我不确定如何取消选择角色,因为如果您在创建过程中添加了角色,则在编辑时始终会在表单上选择至少一个角色。

    您必须更改脚手架 View 才能实现您想要的。使用无选择 的属性(property)g:选择如果用户不想选择任何现有角色,则指定默认值。

    您的 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 接口(interface)。它不支持很多东西,你必须自己实现它们。

    关于Grails 2.5 脚手架在绑定(bind)期间不会删除最后一个 hasMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060858/

    相关文章:

    mongodb - Grails GORM + Mongo,如何将自定义数据保存到ID?

    grails - 2.5.4 Assets 管道无法正常工作

    mysql - Windows 7 上 ruby​​ on rails 3 的问题

    grails - Quartz的Quartz插件

    grails - 将 Grails 域类设置为 "No-Insert Mode"

    grails - SpringSecurityService:注销其他用户?

    asp.net-mvc - Syntaxlistpool.free 分离的语法构建器。在搭建 Asp.Net Core 2.1 的同时

    c# - 如何建模这个实体

    grails - 使用geb进行功能测试的依赖性

    grails - 用于单元测试中grails服务属性的NullPointerException