3

コントローラーのハックに頼らずに、Grails で 1 対多の関係を自動バインドするのに苦労しています。Grails での 1 対多の関係は順序付けられておらず、何らかの形でバインディングに影響を与えるセットであることを理解しています。

このフォームを保存すると、データが正しく保存される場合とそうでない場合があります。著者が 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

1対多のフォームを送信する同様の問題に苦労しました。セットをバッグに変換することで、アプリで解決しました。

booksしたがって、特にセットである必要がない限り、これを試してください:

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