3

我很难在 Grails 中自动绑定一对多关系,而无需求助于控制器中的一些 hack。我知道 Grails 中的一对多关系是一个无序的集合,并且会以某种方式影响绑定。

当我保存此表单时,有时数据会正确保存,有时则不能。如果一个作者有 3-4 本书,似乎它的工作频率较低。

在此示例中,我尝试删除所有不相关的代码来说明问题。

楷模:

class Author {
    String name
    static hasMany = [ books:Book ]
}

class Book {
    String title
    static belongsTo = [ author:Author ]
}

看法:

<g:form method="post" class="form-horizontal">
    <g:hiddenField name="id" value="${authorInstance?.id}" />
    <g:hiddenField name="version" value="${authorInstance?.version}" />
    <g:textField name='name' value='${authorInstance?.name}'/>
    <g:each var="book" in="${authorInstance.books}" status="i">
        <g:hiddenField name='book[${i}].id' value='${book.id}'/>
        <g:textField name='book[${i}].title' value='${book.title}'/>
    </g:each>
    <g:actionSubmit action="update" value="Update" />
</g:form>

控制器:

def update(Long id, Long version) {
    def author = Author.get(id)

    // removed "Not Found" and "Version" validation for this example

    author.properties = params

    if (!author.save(flush: true)) {
        render(view: "edit", model: [author: author])
        return
    }

    flash.message = "Success"
    redirect(action: "list"
}

如何构建我的模型和视图,以便让控制器保持相对不变?

4

2 回答 2

2

我在提交一对多表格时遇到了类似的问题。我通过将集合转换为包在我的应用程序中解决了它。

因此,除非您特别需要books成为一组,否则请尝试以下操作:

class Author {
    String name
    Collection<Book> books
    static hasMany = [ books:Book ]
}
于 2013-09-27T07:02:11.383 回答
0

我发现最简单的方法是强制“书籍”成为一个列表,以便对其进行排序。

class Author {
    List books <------- Added (by default this one-to-many relationship is a Set)
    String name
    static hasMany = [ books:Book ]
}

然后视图可以保持不变,一切都应该按预期工作。

于 2013-09-30T18:31:39.320 回答