0

「考え方」をよりよく理解するために、Scaffolding を使用しない grails アプリを作成しようとしています。:)編集/更新方法に行き詰まっています。「編集」ボタンで、オブジェクト作成時と同じ種類の入力フォームを開きます。すべてのフィールドに情報が入力され、ID がリンクで渡されます。

「メッセージの編集」で既存のオブジェクトを更新したいのですが、新しいオブジェクトを作成するか、エラーが発生しました - null オブジェクトにプロパティ「送信者」を設定できません

私の「edit.gsp」は次のようになります。

    <!DOCTYPE html>
<html>
<head>
    <meta name="layout" content="main"/>


</head>
<body>
<h2>Edit this message</h2>

    <g:if test="${flash.message}">
    <div class="alert alert-error" style="display: block">${flash.message}</div>
    </g:if>
    <div class="createStuff" id ="inputs">
        <g:formRemote url="[action: 'editSave']" update="allTheMessages"
        name="updateStatusForm">
            <table>
                <tr>
                <td>Sender:</td>
                <td><g:textField name="sender" value="${message.author}"/></td>
                </tr>

                <tr>
                <td>Message</td>
                <td><g:textArea name="msg" value="${message.text}"/></td>
                </tr>
                <tr>
                <td>Some status</td>
                <td><g:textField name="status" value="${message.status}"/></td>
                </tr>
                <tr>
                <td>Wanna publish?</td>
                <td><g:select name="toPublish" from="${['Publish','Archive']}" keys="${[true,false]}"/></td>
                </tr>
            </table> 
            <g:submitButton name="Edit the msg"/>
        </g:formRemote>
    </div>

</body>
</html>

そして、コントローラーでの私の方法はさまざまです:

  def editSave() {
        def message2save = Message.get(params.id)
        message2save = new Message(text: params.msg, author: params.sender, status: params.status, toPublish: params.toPublish).save(insert: false, update: true) //1st way - still creates new Message - obviously because of "new Message"
        message2save.sender = params.sender //part of 2nd way - in this case there appears NullPointerException mentioned above --> Cannot set property 'sender' on null object

        message2save.save()
        redirect(action:"index")

    }

私は何を間違っていますか?既存のレコードを更新するにはどうすればよいですか? よろしくお願いします。:)

4

1 に答える 1

2

GORM は、データベースからレコードを正常にロードしたときに、レコードを更新しているかどうかを認識します。これはあなたのコードで行われます:

def message2save = Message.get(params.id)

問題は、フォームでメッセージの ID を送信していないことです。したがって、次を追加する必要があります。

<g:hiddenField name="id" value="${message.id}" />
于 2013-11-10T17:35:41.433 に答える