Ruby on Rails 2.3.2 でフィルタ チェーンを操作するより動的な方法が必要です。
現時点では、クラスがロードされるとフィルター チェーンが構築されます。クラスがロードされた後、ある時点でフィルターチェーンを再構築する必要があります。
これは、フィルタ チェーンが MyController 用に構築された後に次のようなことを実行できる拡張機能を使用する Rails プロジェクト (Spree、Radiant も影響を受ける可能性があると推測しています) と関係があります。
MyController.class_eval do
before_filter :my_filter_method
end
ApplicationController.class_eval do
before_filter :app_filter_method
end
ここでの問題は、app_filter_method
フィルターがMyController フィルター チェーンに追加されないことです。これは、MyController のフィルター チェーンが ApplicationController のフィルター チェーンの以前のコピーから構築されているためです。ApplicationController のフィルター チェーンのこのコピーには、まだフィルターが適用されていませんapp_filter_method
。
これまでのところ、FilterChain の再構築が行われる可能性のある場所が 2 つあります。
1) MyController.filter_chain で呼び出されるたびに
2) オンデマンドでリロード可能。したがって、 MyController.reload_filter_chain は、チェーン内の MyController のサブクラスのフィルターを使用して、フィルター チェーンを再構築します。
おそらく、リクエストごとにフィルター チェーンを構築する ReloadableFilterChain のような FilterChain のサブクラスを指定することで、それが可能になるかもしれません。
Ruby on Rails 2.3.2 用の GitHub の filters.rb のソースへのリンクを次に示します。
ここにいる皆さんの何人かが、これを行う方法についての洞察やアドバイスを持っていることを願っていました.
どんな助けでも大歓迎です。
エリオット
要求された詳細:
Spree は、拡張機能を使用して動作を変更する Rails アプリです。
コントローラーにフィルターを追加するために拡張機能が使用される場合があります (質問のコード例など)。使用例の 1 つは、静的コンテンツ拡張です。
静的コンテンツ拡張機能を使用すると、データベースに格納されている HTML ページを、指定した要求パスに対して表示することができます。たとえば、/products リクエスト パスに対して Spree が表示するデフォルトのコンテンツの代わりに、これらの HTML ページの 1 つを表示できます。
静的コンテンツ拡張機能は、すべての要求をフィルタリングし、パスをチェックします。パスがデータベース内のいずれかのページと一致する場合、フィルターはそのページをレンダリングします。
静的コンテンツ拡張は、そのフィルターを次のように宣言します。
Spree::BaseController.class_eval do
before_filter :render_page_if_exists
def render_page_if_exists
...
end
end