2011-01-11 3 views
4

У меня есть контроллер, который наследуется от класса с 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") 
    } 
} 

Когда я звоню индекс на WorkingController, я получаю выход SnargeBarFoo. Когда я называю индекс на BrokenController, я получаю IllegalAccessError

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

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

+0

У вас есть решение этой проблемы? – arvind

ответ

0

Существует разница между

this. 

и

this.& 

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

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

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

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

В документации говорится следующее aboit это. &

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

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

Смежные вопросы