Есть ли более простой способ сделать согласованные ответы в Grails? - PullRequest
1 голос
/ 15 декабря 2011

Из того, что указано в руководстве пользователя Grails, рекомендуемый способ для отправки различных форматов контента на основе согласования контента заключается в использовании блока withFormat:

import grails.converters.XML
class BookController {

    def list() {
        def books = Book.list()
        withFormat {
            html bookList: books
            js { render "alert('hello')" }
            xml { render books as XML }
        }
    }
}

Однако я бы хотел, чтобы ответы ВСЕХ моих методов контроллера делали это. Есть ли лучший способ получить такое поведение, чем просто скопировать и вставить блок withFormat в конце каждого действия по возврату содержимого?

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Первые две вещи, которые всплыли в моей голове, были перехватчики и фильтры:

http://grails.org/doc/1.3.7/ref/Controllers/afterInterceptor.html

http://grails.org/doc/latest/guide/6.%20The%20Web%20Layer.html#6.6 Фильтры

Перехватчики не будут работать, потому чтоВы не можете сделать с форматом.Облом, потому что это более глобально.

Фильтры будут работать на контроллере для каждого контроллера, но по крайней мере вы минимизируете дублирование на этом уровне.

def afterInterceptor = {model, modelAndView ->
    withFormat {
        html { model }
        js { render "alert('hello')" }
        xml { render model as XML }
    }
}

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

Может быть, все ваши afterInterseptors передают модель modelAndView в общийучебный класс?Кажется, это работает :) (работая над ответом, отвечая на вопрос)

@Mixin(AfterInterceptorWithFormat)
class FirstController {

    def action1 = {}
    def action2 = {}

    def afterInterceptor = {model, modelAndView ->
        performAfterInterceptor(model, modelAndView)
    }
}

class AfterInterceptorWithFormat {

    def performAfterInterceptor(model, modelAndView) {
        withFormat {
            html { model }
            js { render "alert('hello')" }
            xml { render model as XML }
        }
    }
}

Дайте этому повод и дайте мне знать, что вы думаете.

0 голосов
/ 30 января 2012

В итоге я просто настроил шаблоны CRUD по умолчанию, чтобы в конце каждого метода был блок withFormat.

Я понял, что то, что я действительно хотел, былопросто согласованный с контентом CRUD, поэтому все, что мне для этого нужно, - это поместить код в шаблоны.

Остальные контроллеры для несмешанных частей моего приложения не нуждаются в выводе без HTML, поэтому яне нужно согласовывать контент ни о чем, кроме грубых контроллеров.

...