0

バグのコントローラー:

これはバグの create メソッドです。印刷しbugInstance.activitiesたところ、アクティビティ オブジェクトが含まれていました。

def create = {
        def bugInstance = new Bug()
        def activity = new Activity(description:"created")

        bugInstance.properties = params
        bugInstance.addToActivities(activity)
        return [bugInstance: bugInstance]
    }

次に、save メソッドを見て、まったく同じものを出力しました。結果は null です。そのため、作成したアクティビティが何らかの形で失われ、その理由がわかりません。これは本当にデフォルトの動作ですか? このような単純なコードが機能しない理由はないように思われるため、私は本当に基本的な間違ったことをしていますか?

def save = {

    def bugInstance = new Bug(params)
    println bugInstance.activities
    if (bugInstance.save(flush: true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'bug.label', default: 'Bug'), bugInstance.id])}"
        redirect(action: "show", id: bugInstance.id)
    }
    else {
        render(view: "create", model: [bugInstance: bugInstance])
    }
}

save メソッドにアクティビティを追加することでこれを回避できることはわかっていますが、create() -> save() からアクティビティが失われるのはなぜですか?

4

3 に答える 3

1

新しいインスタンスで save() を呼び出すことはありません。

def create = {
   def bugInstance = new Bug()
   def activity = new Activity(description:"created")

   bugInstance.properties = params
   bugInstance.addToActivities(activity)
   bugInstance.save()
   return [bugInstance: bugInstance]
}

Activity コレクションにあるため推移的に保存されるため、Activity を保存する必要はありません。

于 2010-07-19T22:46:57.280 に答える
0

自動生成された create.gsp を使用している場合、アクティビティ セットはフォームに含まれません。もちろんモデルにはありますが、クライアント側でレンダリングされるアクティビティ フィールドはありません。保存に戻ると、アクティビティが失われていることは明らかです。達成したいことに応じて、create.gsp または (最初に) アクティビティの説明を含む隠しフィールドにアクティビティ セレクターを追加できますが、保存アクションでは、任意のアクティビティ パラメータを処理する必要があると思います。 grails の魔法は、Activity をインスタンス化するまでには至らないからです。保存アクションでバグ自体をインスタンス化するのと同じ方法で、アクティビティをインスタンス化し、永続化する場合はそれを保存する必要があります。

編集:アクティビティリスト全体を本当に渡したい場合は、インデックス付きプロパティを利用できます。

create.gsp に次を追加します。

<g:each status="i" var="activity" in="${bugInstance.activities}">
  <!-- one hidden field for each property of each attached activity  -->
  <g:hiddenField
    name="activities[${i}].description"
    value="${activity.description}" />
</g:each>

そして、保存方法でこれ:

params.activities.each{ activity ->
  bugInstance.addToActivities(new Activity(activity))
}

しかし、あなたの場合、単一のフィールドから 1 つのアクティビティをインスタンス化するだけで十分かもしれません。

于 2010-07-19T22:48:38.173 に答える
0

ばかげた質問のように聞こえるかもしれませんが、作成でインスタンス化されたバグ インスタンスを使用して、create.gsp に隠しパラメータまたは何かを設定していますか?? つまり、あなたがここでしていることに何の問題もないと思います。create.gsp はどのように見えますか?

于 2010-07-19T21:31:10.933 に答える