2009-07-13 12 views

Odpowiedz

2

Nie jestem świadomy eleganckiego sposobu, aby to osiągnąć. Jednak przy odrobinie myślenia lateralnego ... możesz upewnić się, że wszystkie kontrolery używają prepend_before_filter. W ten sposób, jeśli twój moduł używa before_filter, będziesz wiedział, że zawsze będzie to ostatni filtr, ponieważ kontrolery będą zawsze dodawać swoje filtry na początku łańcucha filtrów.

1

Zgodnie z interfejsem API rails, domyślny "before_filter" jest aliasem dla "append_before_filter", który dołącza filtry na końcu listy filter_chain. Powiedziałbym, że istnieje uzasadnione założenie, że jeśli prawidłowo uporządkujesz filtry w kontrolerze, zostaną one wykonane w kolejności, w której są wymienione. Jak poprzednia odpowiedź sugeruje, że istnieje również "prepend_before_filter", który zapewnia, że ​​dodawany filtr znajduje się na początku łańcucha filter_chain.

2

Możesz zastąpić before_filter w swoim module lub zlecić wywołanie zwrotne self.included deklarując alias_method_chain :before_filter, :final_filter. Nie jest to zalecane dla kodu, który chciałbyś przenosić w wielu wersjach Railsów lub kiedy będziesz wydawał kod, który będzie używany w innych kontekstach.

3

Oto prosty moduł, który pozwala na wykonanie niepożądanego kodu po pełnym zestawie before_filters. Przy odrobinie pracy prawdopodobnie można by to wyczyścić, tak aby tutaj została wykonana kolejka specjalnych after_before_filters (z odpowiednimi zachowaniami zatrzymania itd.).

module OneLastFilterModule 

    def self.included(base) 
    base.class_eval do 

     def perform_action_without_filters_with_one_last_filter 

     # 
     # do "final" before_filter work here 
     # 

     perform_action_without_filters_without_one_last_filter 
     end 
     alias_method_chain :perform_action_without_filters, :one_last_filter 

    end 
    end 

end 

pamiętać, że należy być ostrożnym w ten sposób, ponieważ kontrolerów mogą sami dokonać założenia dotyczące zamawiania filtra opartego na zamówienie deklaracji.

Powiązane problemy