ラック ミドルウェアと ActionController フィルターは、実際にはまったく異なります。
Rack は標準の Ruby Web サーバー インターフェイスです。これは、Rack アプリケーションまたは「ミドルウェア」を連鎖させて、それぞれが特定の方法で要求/応答を変換できるように機能するように設計されています。Rack ミドルウェアを作成/使用すると、実際に Rails アプリに到達する前にリクエストを変換する機会が得られます。
ActionController フィルターは、Rails の直接のコントローラー メソッドの前または後に実行される単なる before/after フックです。これらはコントローラ メソッドの直前または直後に呼び出されますが、Rails スタックの残り全体の後に呼び出されます。
したがって、Rack Middleware と ActionController フィルターを介して可能なことには大きな違いがあります。つまり、Rack Middleware はアプリケーション コードの前に実行されるため、アプリケーション コードと同じスコープでは実行されません。明示的に要求し、必要な初期化 (データベース接続の確立など) を実行しない限り、アプリ モデルなどを使用することはできません。
あなたが経験則を探しているなら、私の頭のてっぺんから、私があなたに言うことはここにあります:
特定のコントローラーでのみリクエスト before メソッドを処理したい場合は、そのコントローラーで before フィルターを使用します。
アプリ内のすべてのコントローラー メソッドの前にリクエストで何かを実行したい場合で、実行したいことがアプリケーション固有のものであるか、アプリケーション コードに依存している場合は、ApplicationController でフィルターを使用します。
アプリケーション コードにまったく関連付けられていない汎用的な処理をリクエストで行いたい場合、およびそれを別のアプリで再利用できると便利だと考える場合は、Rack ミドルウェアが適しています。
それが役立つことを願っています。