Как вы соединяете цепочки перед интерцепторами вместе? - PullRequest
4 голосов
/ 11 января 2011

У меня есть контроллер, который наследует от класса с beforeInterceptor.

Вот мой базовый класс.

class FooBase {
    def beforeInterceptor = [action: {parentInterceptor()}]

    def parentInterceptor() {
        render("Snarge")
    }
}

Вот версия контроллера, которая не работает.

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

Вот версия, которая работает

class WorkingController extends FooBase
{
    def beforeInterceptor = {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

Когда я вызываю index для WorkingController, я получаю вывод SnargeBarFoo.Когда я вызываю index на BrokenController, я получаю IllegalAccessError

Я полагаю, у меня есть версия, которая работает, поэтому мой вопрос больше о том, что здесь происходит?Почему одна версия может обращаться к родительскому классу из дочернего класса, а другая - нет?

Я искал вариант использования, который позволяет использовать функции-перехватчики с функциональностью except.Это требует способности цепочки перехватчиков, когда они реализованы с использованием карты.

1 Ответ

1 голос
/ 28 февраля 2011

Есть разница между

this.

и

this.&

работает следующий код - проверьте третью строку:

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {this&childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

Документация гласит следующее об этом. &

Method Reference     .&      Get a reference to a method, can be useful for creating closures from methods 

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

...