2012-02-17 7 views
1

"後" のGrailsからIDをリダイレクトへのアクセスクロージャ保存(1.3.7)足場コントローラは、次のように私は標準Grailsのを持っているフィルタ

 def filters = 
{ 
    save(controller:'*', action:'save') 
    { 
     after = 
     { 
      // How do I get the newly created entity's ID here?  
     } 
    } 

すべてのコントローラに特別なコードを追加しなくても、コントローラのフィルタ内で新しいエンティティのIDにアクセスする方法はありますか?

答えて

1

splixが推奨するようにリクエストに保存するか、代わりにインターセプタを使用することを検討してください。 'afterInterceptor'では、モデルに直接アクセスできます。 Controller Interceptors

があなたのコメントに基づいて 更新を参照してください。あなたはメタプログラミング技術を使用して、ドメインクラス上の各「afterInsert」コールを傍受できます。たとえば、ブートストラップでこれを追加すると、新しく作成されたすべてのドメインオブジェクトにアクセスして一般的な操作を実行できるはずです。

+0

質問を更新しました。新しく作成したエンティティ(つまり、検索インデックスの更新)をすべてのコントローラで処理したいのですが、つまり、モデルにアクセスする必要がありますが、すべてのコントローラに適用する必要があるため、コンテキストのようなフィルタですべて行います。 –

+0

誠に申し訳ありません。 –

3

あなたは

request.setAttribute('CREATED_ID', instance.id) 

のように、requestにそれを入れて、

def id = request.getAttribute('CREATED_ID') 

アップデートとして、フィルタで取得できます。

それとも、またbeforeInsertイベントでの要求にそれを置きます、または自分のイベントリスナーで:http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping

+0

この回答は私の元の質問には正しいですが、私は質問を更新して公開してから質問を更新しました。 –

+0

[OK]を私の回答 –

+0

答えを更新しましたが、私が正しく理解した場合、更新プログラムのソリューションは、各ドメインクラス "カスタマイズ"に各コントローラをカスタマイズする問題をシフトします。問題は、IDがリダイレクトに渡されていることです。 "リダイレクト(アクション:" show "、id:instance.id)"、各スキャフォールドされたコントローラ内 - これは何とかフィルタの後からアクセスできますか?これは、コントローラ/ドメインクラスのコーディングと混乱を最小限に抑えることを意味します。 –