2014-09-22 2 views
0

Я ищу способ повторного использования кода рендеринга, разделяемого несколькими контроллерами. Например, следующий проводящий вызов:Grails: повторное использование вызовов визуализации в контроллерах

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

Можно ли предоставить такой код между контроллерами?

ответ

0

Да, вы можете поместить это в базовый класс или добавить класс/вспомогательный класс. Убедитесь, что return в любом случае (последняя строка в groovy считается return по умолчанию).

например.

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

и назвать его somewher еще:

if (somethingswrong) { 
    return renderBadRequest() 
} 
+0

может я сделать для вспомогательного класса? Я думал, что смогу отображать только контроллер –

+1

, по крайней мере, передав контроллер – cfrick

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

0

Вы также можете использовать Примеси. Одним из преимуществ использования BaseController является то, что контроллеры могут иметь более одного микшина и в то же время продлевать еще один, например. 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() 
     } 
} 
Смежные вопросы