Grails:在控制器中重用渲染调用

时间:2014-09-22 21:34:48

标签: grails

我正在寻找一种方法来重用多个控制器共享的渲染代码。例如,以下渲染调用:

render(contentType: "text/json", status: BAD_REQUEST) {
    error(description: 'Missing param')
}

是否可以在控制器之间共享此类代码?

3 个答案:

答案 0 :(得分:0)

是的,您可以将其放入基类或添加一些工具/帮助程序类。在任何情况下一定要return(默认情况下,groovy中的最后一行被视为return

e.g。

def renderBadRequest() { render(contentType: "text/json", status: BAD_REQUEST) { error(description: 'Missing param') } }

并将其称为其他人:

if (somethingswrong) {
    return renderBadRequest()
}

答案 1 :(得分:0)

您还可以将此功能提取到Filter

class BadReqRenderingFilters {

  def filters = {
    all( controller:'*', action:'*' ) {
      after = { Map model ->
        if( model.somethingBad ){
          render(contentType: "text/json", status: BAD_REQUEST) { error(description: 'Missing param') }
          return false 
        }
      }
    }
  }
}

请参阅http://grails.org/doc/2.3.x/guide/theWebLayer.html#filters

答案 2 :(得分:0)

您也可以使用mixins。使用BaseController的一个优点是控制器可以有多个mixin,同时又可以扩展另一个。 RestfulController。

这是一个mixin的例子

// src/groovy/...
class ControllerResponseMixin{

    protected renderBadRequest(){
        render(contentType: "text/json", status: BAD_REQUEST) {
            error(description: 'Missing param')
        }
    }

}

然后您可以在控制器中使用如下:

// grails-app/controller/...
@Mixin(ControllerResponseMixin)
class SomeController{

        def show(){
            ...
            renderBadRequest()
        }
}