3

私のGrailsコードには、findAllByクエリを実行した後に別のコントローラーアクションにリダイレクトする検索関数があります。

def results = Foo.findAllByBar(baz)
redirect(action: "result", params: [results: results])

findAllByBarは、期待どおりにモデルを含むArrayListを返しますが、リダイレクト後、受信アクションは文字列配列を取得します。さらに悪いことに、結果が1つしかない場合は、配列も取得せず、文字列を取得するだけです。

受信ビューで結果を繰り返す必要があることを考えると、文字列でそれを行うと、すべての文字が個別に細心の注意を払って印刷されます。それはおそらく理想的な行動ではないことに私たちは皆同意することができます。

4

2 に答える 2

8

リダイレクトすると、クエリ文字列にパラメータを含む新しいGETリクエストが生成されます(例:/ controller / result?foo = bar&baz = 123)。これは単なる文字列であるため、オブジェクトをそこに配置することはできません。

オブジェクトのIDをパラメータに入れて、resultアクションにロードすることができます。

def action1 = {
   def results = Foo.findAllByBar(baz)
   redirect(action: "result", params: [resultIds: results.id.join(',')])
}

def result = {
   def resultIds = params.resultIds.split(',')*.toLong()
   def results = Foo.getAll(resultIds)
}

またはそれらをFlashスコープに入れます。

def action1 = {
   flash.results = Foo.findAllByBar(baz)
   redirect(action: "result")
}

def result = {
   def results = flash.results
}
于 2011-08-27T15:02:13.487 に答える
2

リダイレクト方式の代わりにチェーン方式を使用したいようです。チェーンを使用すると、レンダリングと同様のパラメーターとしてモデルを渡すことができます。例は次のとおりです。

chain(action:'result',model:[results:results])

詳細については、次のリンクを参照してください: http ://www.grails.org/doc/latest/ref/Controllers/chain.html

于 2011-09-13T18:08:39.020 に答える