Зерновой репетированный код для действий в контроллерах - PullRequest
0 голосов
/ 14 июня 2011

Я уже разместил этот вопрос, но я понял, что 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 повторяли код для всех действий но мне не удалось заставить его работать. Я бы оценил подробное объяснение о любом из решений, если это возможно: p Спасибо заранее, VA

Ответы [ 3 ]

0 голосов
/ 14 июня 2011

Если вы используете одну и ту же модель на нескольких страницах. Я бы порекомендовал вам использовать taglib для него.

0 голосов
/ 14 июня 2011

То есть это не та же модель, а модель с повторяющейся деталью.

Вы должны знать, что возвращаемое значение является обычным Map.

Таким образом, возвращаемое значение может быть построено как return getCommonModel() + [book: currentBook], где getCommonModel() возвращает другую карту.

0 голосов
/ 14 июня 2011

Если вы хотите вернуть одну и ту же модель из всех ваших действий, этот подход должен работать:

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() может только вернуть модельс одной записью мне трудно в это поверить.Можете ли вы немного рассказать об этом или опубликовать дополнительную информацию (например, stacktrace, unit-тест), которая показывает, как / почему она не работает?

Обновление

После прочтения ваших комментариев ниже я думаю, что янаконец, поймите, чего вы хотите достичь, то есть добавить модель, возвращаемую 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 в фильтр, который выполняется после действий контроллера
...