Контроллеры Grails повторяют код для всех действий

#grails #controller #action

#grails #контроллер #Экшен

Вопрос:

Представьте себе этот контроллер:

 class exampleController{

def action1 = {}

def action2 = {}

def action3 = {}

def action4 = {}

def action5 = {}

}
  

Я хочу иметь возможность возвращать во всех действиях в этом контроллере одни и те же параметры. Представляя это:

 def user = session.user    
[user: user]
  

Есть ли какой-либо способ сделать это, помимо написания одного и того же кода для всех действий? Параметры возврата session.user — это всего лишь пример. На самом деле я не хочу его возвращать.

Ответ №1:

Простое решение — поместить этот код в метод и вызывать его из каждого действия

 class exampleController{

  def action1 = {getModel()}

  def action2 = {getModel()}

  def action3 = {getModel()}

  def action4 = {getModel()}

  def action5 = {getModel()}

  private getModel() {
    def user = session.user    
    [user: user]    
  }
}
  

Хотя это требует некоторого количества повторений (вызова одного и того же метода), гораздо более очевидно, что здесь происходит. При отладке / тестировании контроллера легко забыть о фильтрах и перехватчиках, которые часто могут приводить к таким вопросам, как

что за @**% здесь происходит?

Ответ №2:

Используйте фильтр — http://grails.org/doc/latest/guide/6. The Web Layer.html#6.6 Filters — или последующий перехватчик — http://grails.org/doc/latest/guide/6. The Web Layer.html#6.1.5 Controller Interceptors

Ответ №3:

У меня похожий случай, и я модифицировал строительные леса grails для генератора контроллера.

 class MyClassController {

    def list = {
        ...
    }

    def show = {
        def eInstance = beanIfExist()
        ...
    }

    def edit = {
        def eInstance = beanIfExist()
        ...
    }

    def update = {
        def eInstance = beanIfExist()
        ...
    }

    def delete = {
        def eInstance = beanIfExist()
        ...
    }

    def beanIfExist = {
        def beanInstance = MyClass.get(params.id)
        if (beanInstance) {
            return beanInstance
        } else {
            flash.message = "Error, invalid record."
            redirect(action: "list")
            return null
        }
    }

}
  

Это мое предложение, теперь, если вам нужен другой, который отправлял данные для просмотра, вы можете использовать перехватчики.