2011-08-27 54 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'。使用它的任何缺点?与重定向? –