私はコントローラのbefore_filterを定義したいと思いますが、常に最後に実行してください。before_filterを常に最後に実行させる方法はありますか?
私はappend_before_filterについて知っていますが、他のクラスが後で他のbefore_filtersを追加するモジュールでこのフィルタを指定したいと思います。
これを行う方法はありますか?
私はコントローラのbefore_filterを定義したいと思いますが、常に最後に実行してください。before_filterを常に最後に実行させる方法はありますか?
私はappend_before_filterについて知っていますが、他のクラスが後で他のbefore_filtersを追加するモジュールでこのフィルタを指定したいと思います。
これを行う方法はありますか?
これを実現するうまい方法がわかりません。しかし、いくつかの横方向の考え方を使って、すべてのコントローラがprepend_before_filter
を使用していることを確認できます。そうすれば、モジュールがbefore_filter
を使用している場合、コントローラーはフィルターを常にフィルターチェーンの先頭に追加するため、常に最後のフィルターになります。
rails APIによると、デフォルトの "before_filter"は "append_before_filter"のエイリアスで、filter_chainリストの最後にフィルタを追加します。私は合理的な仮定があると言いたいのは、コントローラでフィルタを正しく注文すれば、リストに記載された順序で実行されるということです。前の答えが示唆しているように、追加するフィルタがfilter_chainの前にあることを確認する "prepend_before_filter"もあります。
モジュール内のbefore_filter
を無効にするか、またはself.included
コールバックフックでalias_method_chain :before_filter, :final_filter
を宣言することができます。これは、複数のバージョンのRailsに移植できるコードや、他のコンテキストで使用するコードをリリースする予定のコードにはお勧めできません。
ここでは、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
コントローラは自身が宣言順に基づいて、フィルタの順序についての仮定を行うことができるので、あなたは、これを行うには注意する必要があります注意してください。