2009-07-13 19 views
6

私はコントローラのbefore_filterを定義したいと思いますが、常に最後に実行してください。before_filterを常に最後に実行させる方法はありますか?

私はappend_before_filterについて知っていますが、他のクラスが後で他のbefore_filtersを追加するモジュールでこのフィルタを指定したいと思います。

これを行う方法はありますか?

答えて

2

これを実現するうまい方法がわかりません。しかし、いくつかの横方向の考え方を使って、すべてのコントローラがprepend_before_filterを使用していることを確認できます。そうすれば、モジュールがbefore_filterを使用している場合、コントローラーはフィルターを常にフィルターチェーンの先頭に追加するため、常に最後のフィルターになります。

1

rails APIによると、デフォルトの "before_filter"は "append_before_filter"のエイリアスで、filter_chainリストの最後にフィルタを追加します。私は合理的な仮定があると言いたいのは、コントローラでフィルタを正しく注文すれば、リストに記載された順序で実行されるということです。前の答えが示唆しているように、追加するフィルタがfilter_chainの前にあることを確認する "prepend_before_filter"もあります。

2

モジュール内のbefore_filterを無効にするか、またはself.includedコールバックフックでalias_method_chain :before_filter, :final_filterを宣言することができます。これは、複数のバージョンのRailsに移植できるコードや、他のコンテキストで使用するコードをリリースする予定のコードにはお勧めできません。

3

ここでは、before_filtersの完全なセットの後に任意のコードを実行できる単純なモジュールを示します。ちょっとした作業で、これをきれいにして、after_before_filtersという特別なキューがここで実行されるようにすることができます(適切な停止動作など)。

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 

コントローラは自身が宣言順に基づいて、フィルタの順序についての仮定を行うことができるので、あなたは、これを行うには注意する必要があります注意してください。

関連する問題