Grains重复编码器中的操作代码

时间:2011-06-14 11:23:33

标签: grails filter controller action

我已经发布了这个问题,但我意识到aswer不是我想要的。想象一下这个控制器:

    class exampleController{

    def action1 = {
           ...

[lala: lala, lele: lele]}

           ...
    }
    def action15 = {
           ...

[lala: lala, lele: lele]

}

我希望能够在此控制器的所有动作中返回相同的参数。想象一下:

def book = Book.findAllByIsbn(Isbn.get(1))  
[book: book]

除了在所有动作上编写所有相同的代码之外,还有什么方法可以做到这一点吗?我尝试过这种方法,它不起作用:

def action5 = {getModel()}

  private getModel() {
    def book = Book.findAllByIsbn(Isbn.get(1))  
[book: book]  
  }
}

它不起作用,因为我的想法是,他确实接受了多个[return1:aaa,return2:bbb]。有什么建议吗?我也尝试过像这样的过滤器:Grails controllers repeated code for all actions 但我无法使其成功。如果可能的话,我会对任何解决方案进行详细解释:p先谢谢, VA

3 个答案:

答案 0 :(得分:0)

如果您想从所有操作中返回相同的模型,则此方法应该有效:

class ExampleController {

  def action5 = {getModel()}
  def action1 = {getModel()}
  //etc.

  private getModel() {
    def book = Book.findAllByIsbn(Isbn.get(1))  
    [book: book]  
  }
}

如果您想要返回相同的模型从所有操作中呈现相同的视图,您可以从每个操作返回相同的ModelAndView,但之后我会问您为什么如果他们都做了完全相同的事情,需要单独的行动吗?

我真的不明白你的假设

  

这是行不通的,因为我觉得,他确实接受了多个[return1: aaa, return2: bbb]

如果您建议getModel()只能返回带有单个条目的模型,我发现很难相信。你能详细说明一下吗,或者发布一些更多的信息(例如堆栈跟踪,单元测试)来说明它是如何/为什么不起作用的?

更新

在阅读下面的评论之后,我想我终于明白了你想要实现的目标,即将getModel()(上面)返回的模型附加到各种其他操作返回的模型中。这有用吗:

class ExampleController {

  def action5 = {
    def action5Model = [foo: 'bar']
    return addBookModel(action5Model)
  }

  def action1 = {
    def action1Model = [foo2: 'bar2']
    return addBookModel(action1Model)
  }
  //etc.

  private Map addBookModel(Map model) {
    def book = Book.findAllByIsbn(Isbn.get(1))  
    model.book = book
    return model
  }
}

此方法仅在您想要在单个控制器中添加书籍模型时才有效。如果要在多个控制器中添加书籍模型,可以通过以下方式执行此操作:

  • addBookModel放入控制器扩展的抽象类
  • addBookModel放入与控制器混合的类中(使用@Mixin
  • addBookModel放入控制器操作后执行的过滤器

答案 1 :(得分:0)

所以它不是同一个模型,而是一个重复部分的模型。

您应该知道返回值是普通的Map

因此,返回值可以像return getCommonModel() + [book: currentBook]那样构建,其中getCommonModel()返回另一个地图。

答案 2 :(得分:-1)

如果您在多个页面中使用完全相同的模型。我建议你使用taglib。