2012-10-19 5 views
5

Ich möchte die config.ru-Datei zu Rack-Middleware im Gegensatz zur Verwendung der config.middleware-Array zu klären.Rails Middleware: Middleware zu config.ru oder zum config.middleware Array hinzufügen?

Wenn ein config.ru Regel wie folgt aussieht:

require ::File.expand_path('../config/environment', __FILE__) 
use Rack::Deflater 
run TestApp::Application 

Bin ich sagen richtig, dass, wenn ich TestApp run :: Anwendung, Ich trete in Rails interne Middleware? Das heißt, beginnt es die Middleware-Kette, die in config.middleware definiert ist?

Also die effektive Verwendung der Angabe Middleware außerhalb der Schienen-Anwendung ist es, Dinge mit der Anfrage (oder Antwort) außerhalb der Schienen selbst zu tun? In diesem Beispiel reagiert der Deflator auf die Anfrage, bevor die app-Middleware von rails beginnt.

Und die effektive Verwendung von config.middelware ist es, mehr Rails spezifische Middleware anzugeben, die irgendwo innerhalb dieser Kette platziert werden kann?

Auch, wenn die Rack-Anwendung beginnt, was ist die App? (Das wird in die Initialisierung für eine Rack-Anwendung übergeben?). Ich dachte immer, App wäre die Rails App selbst, aber es scheint, dass die Rails App nur eine weitere Middelware in der Kette ist.

Antwort

1

Die Rails-App ist keine Rails-Middleware, sondern eine Rack-App. Es ist die Unterseite der Middlewarekette (gekennzeichnet durch die run anstelle von use).

Ich bin mir nicht ganz sicher über die Reihenfolge, in der das app.config.middleware Array ausgeführt wird, was auch immer Sie in der Datei config.ru setzen, aber ich erwarte, dass die require ::File.expand_path('../config/environment', __FILE__) Zeile erfordert eine Datei irgendwo durchläuft die Middleware-Array und ruft use auf allen von ihnen auf, um sie Rack-Liste hinzuzufügen. Ich würde Middleware im config.middleware-Array angeben, um sicherzustellen, dass es an der gewünschten Stelle platziert wird.

Ich glaube nicht, dass es einen Unterschied zwischen "Rails-spezifische" und "Rack" Middleware gibt. Alles wird in einer riesigen Kette gelaufen, bis du die Schienen App triffst. In der Tat ist eine Menge von Rails-Funktionalität in Form von Middleware (Sie können die gesamte Liste sehen, wenn Sie rake middleware in die Befehlszeile eingeben).