9

Ruby on Rails の最新バージョン (この質問をしている時点では 4) の場合、認証メカニズムなどの要求/応答を変更するコードを実装するための推奨される方法は何ですか? アクション コントローラーのフィルター メソッドを使用して同じ機能を実現できるように見えますが、 Rack ミドルウェアを推奨している多くのサイトやチュートリアルを目にします。

推奨される方法論に加えて、それぞれの長所と短所の比較を提供できますか? 私の最初の調査では、ミドルウェアがそのレベルの制御を行うことができないように見えても、特定のコントローラー エンドポイントで特定のフィルターの実行をバイパスできるように、アクション コントローラーのフィルター メソッドが RoR アプリにより緊密に統合されているように思われます。このような詳細は素晴らしいでしょう。ありがとう!

4

2 に答える 2

14

ラック ミドルウェアと ActionController フィルターは、実際にはまったく異なります。

Rack は標準の Ruby Web サーバー インターフェイスです。これは、Rack アプリケーションまたは「ミドルウェア」を連鎖させて、それぞれが特定の方法で要求/応答を変換できるように機能するように設計されています。Rack ミドルウェアを作成/使用すると、実際に Rails アプリに到達する前にリクエストを変換する機会が得られます。

ActionController フィルターは、R​​ails の直接のコントローラー メソッドの前または後に実行される単なる before/after フックです。これらはコントローラ メソッドの直前または直後に呼び出されますが、Rails スタックの残り全体の後に呼び出されます。

したがって、Rack Middleware と ActionController フィルターを介して可能なことには大きな違いがあります。つまり、Rack Middleware はアプリケーション コードの前に実行されるため、アプリケーション コードと同じスコープでは実行されません。明示的に要求し、必要な初期化 (データベース接続の確立など) を実行しない限り、アプリ モデルなどを使用することはできません。

あなたが経験則を探しているなら、私の頭のてっぺんから、私があなたに言うことはここにあります:

  1. 特定のコントローラーでのみリクエスト before メソッドを処理したい場合は、そのコントローラーで before フィルターを使用します。

  2. アプリ内のすべてのコントローラー メソッドの前にリクエストで何かを実行したい場合で、実行したいことがアプリケーション固有のものであるか、アプリケーション コードに依存している場合は、ApplicationController でフィルターを使用します。

  3. アプリケーション コードにまったく関連付けられていない汎用的な処理をリクエストで行いたい場合、およびそれを別のアプリで再利用できると便利だと考える場合は、Rack ミドルウェアが適しています。

それが役立つことを願っています。

于 2015-01-17T02:24:13.267 に答える