我正在寻找一种方法来重用多个控制器共享的渲染代码。例如,以下渲染调用:
render(contentType: "text/json", status: BAD_REQUEST) {
error(description: 'Missing param')
}
是否可以在控制器之间共享此类代码?
答案 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()
}
}