2011-08-27 44 views
3

我的Grails代碼有執行findAllBy查詢後重定向到另一個控制器動作搜索功能:Grails的重定向符PARAMS類型

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

findAllByBar返回與模式一個ArrayList,符合市場預期,但經過重定向接收動作獲取一個String數組。更糟糕的是,當只有一個結果時,它甚至不會獲得一個數組,它只會得到一個String。

鑑於我必須遍歷接收視圖中的結果,因此在字符串上執行該操作將精確地逐個打印每個字母。我們都可以同意這可能不是理想的行爲。

回答

6

重定向導致使用查詢字符串中的參數的新GET請求,例如,/controller/result?foo = bar & baz = 123 - 你不能把對象放在那裏,因爲它只是一個字符串。

你可以把對象的ID在PARAMS和在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 
} 
+0

這將使感 - 我假定重定向內相同的控制器在相同的請求內委派。 – Art

+2

使用[轉發](http://grails.org/doc/latest/ref/Controllers/forward.html)對於那個 –

2

這聽起來像你想使用鏈式方法而不是重定向方法。 Chain可讓您將模型作爲與渲染類似的參數傳遞。 一個例子是:

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

下面有一個鏈接的進一步信息: http://www.grails.org/doc/latest/ref/Controllers/chain.html

+0

很好...不知道'chain'。使用它的任何缺點?與重定向? –