7

Für die neueste Version von Ruby on Rails (4 zum Zeitpunkt der Frage), was ist der bevorzugte Weg, um Code zu implementieren, der die Anfrage/Antwort wie einen Authentifizierungsmechanismus ändert. Ich sehe viele Websites und Tutorials befürworten Rack middleware, während es scheint, als ob die gleiche Funktionalität durch Action Controller filter methods erreicht werden kann.RoR - Was ist bevorzugt - Rack Middleware oder Active Controller Filter?

Zusätzlich zu der bevorzugten Methodik, kann ein Vergleich der Stärken und Schwächen der einzelnen bereitgestellt werden? In meiner ersten Untersuchung scheint es, dass Filtermethoden für Action Controller enger in eine RoR-App integriert sind, sodass Sie bestimmte Filter auf bestimmten Controller-Endpunkten nicht ausführen können, während Middleware diese Kontrollebene nicht zu haben scheint. Details wie diese wären großartig. Vielen Dank!

Antwort

9

Rack-Middleware und ActionCo Die Filter sind sehr unterschiedlich.

Rack ist die standardmäßige Ruby-Webserver-Schnittstelle. Es ist so konzipiert, dass Rack-Anwendungen oder "Middlewares" miteinander verkettet werden können, wobei jede die Anfrage/Antwort in einer bestimmten Weise transformiert. Wenn Sie eine Rack Middleware erstellen/verwenden, haben Sie die Möglichkeit, die Anfrage zu transformieren, bevor sie tatsächlich die Rails App erreicht.

ActionController Filter sind einfach vor/nach Hooks, die vor oder nach Ihren unmittelbaren Controller-Methoden in Rails ausgeführt werden. Diese werden unmittelbar vor oder nach Ihrer Controller-Methode aufgerufen, aber nach der gesamte Rest des Rails-Stacks.

Daher gibt es erhebliche Unterschiede in den Möglichkeiten, die über einen Rack Middleware- und einen ActionController-Filter möglich sind. Da eine Rack Middleware vor Ihrem Anwendungscode ausgeführt wird, wird sie nicht im selben Umfang wie der Anwendungscode ausgeführt. z.B Sie können Ihre App-Modelle usw. nicht verwenden, es sei denn, Sie benötigen sie explizit und führen die erforderliche Initialisierung durch (z. B. Herstellen einer Datenbankverbindung).

Wenn Sie nach Faustregeln, aus der Spitze von meinem Kopf ist hier suchen, was ich Ihnen sagen würde:

  1. Wenn Sie etwas mit der Bitte, bevor Methoden in einem bestimmten Controller nur tun wollen Verwenden Sie einen Vorher-Filter in diesem Controller.

  2. Wenn Sie etwas mit der Anfrage vor allen Controller-Methoden in Ihrer App tun möchten und was Sie tun möchten, ist sehr spezifisch für Ihre Anwendung oder nutzt Ihren Anwendungscode, verwenden Sie einen Filter auf Ihrem ApplicationController.

  3. Wenn Sie etwas Generisches mit der Anfrage machen wollen, nicht an Ihren Anwendungscode gebunden sind, und Sie sich vorstellen, dass es schön wäre, das in einer anderen App wiederverwenden zu können, wäre eine Rack Middleware Besser passen.

Hoffe, dass hilft.

0

Soweit ich Action-Controller-Filter und Rack-Middle tut so ziemlich die gleichen, außer dass zwei Dinge zu verstehen:

  • Rack-Middleware vor dem Rails-Stack genannt wird, so dass Sie einige Leistung gewinnen können (nicht sicher, dass, obwohl)
  • Rack-Middleware ist in sich geschlossen und wieder verwendbaren zwischen verschiedenen Rack-Anwendungen, so dass Ihre Rails/Motor-Controller und Sinatra/Merb/Padrino apss sind sauber und trocken