2013-12-22 4 views
7

Was ist der Unterschied zwischen den Methoden use und run in den Rackup-Dateien? Es scheint run ist immer am Ende von config.ru, aber es scheint, als ob Sie nur use verwenden könnten. Aufschlussreiche Ressourcen würden auch sehr geschätzt werden.Unterschied zwischen Verwendung und Ausführung im Rack

Antwort

1

use ist für Middle

class MyCustomMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if condition 
    env['set-header'] = 'Middleware Can modify the response & pass it into next middleware' 
    end 
    @app.call(env) 
end 

run ein Argument, das zu nennen reagiert und gibt eine endgültige Rack-Antwort mit einem HTTP-Response-Code wie 200.

class MyApp 
    def self.call(env) 
    [200, { "Content-Type" => "text/html" }, ["OK"]] 
end 
end 

den Unterschied zwischen use Um zu verstehen, & run. Sehen wir uns die Struktur der typischen Rack App an.

Typische Rack-App Rack-App mehrere Middleware (n), die zu call reagieren enthält aber nicht zurück letzte Rack Antwort & ein Objekt ab, auf call reagiert, die letzte Rack Antwort zurückgibt, die HTTP-Response-Code enthält (200.404, 500 etc). so gibt es typischerweise mehrere Objekte, die als Mittel & dann ein Objekt, das endgültige Rack-Antwort mit Antwortcode zurückgibt.

Unterschied zwischen use & run

Jetzt mit diesem, scheint es können wir use mehrere Male aufrufen können, einmal für jede Middleware & run nur einmal in einem einzigen Rack-App. Daher ruft use nur eine Middleware auf, während run das Rack-Objekt ausführt, das die endgültige Rack-Antwort mit HTTP-Statuscode zurückgibt.

Beispiel config.ru

use MyCustomMiddleware 
use MyCustomMiddleware2 
use MyCustomMiddleware3 
run MyApp 

Im Fall, wenn etwas über falsch ist, lassen Sie es mich wissen. Also kann ich es korrigieren.

+0

Ist es möglich, irgendwo in der Pipeline von Middleware zu stoppen, zum Beispiel wegen eines Authentifizierungsfehlers? – Cenoc

+0

^^^ Ja. Tatsächlich wird eine ähnliche Methode von Auth von Warden verwendet - eine Rack-basierte Auth, die von allen beliebten Edelsteinen wie Devise verwendet wird. Sie können seine [Quelle der # Call-Methode] (https://github.com/hassox/warden/blob/master/lib/warden/manager.rb#L30-L49) sehen. Im Kern sucht die #call-Methode einfach nach einem bedingten & etwas zu tun. Das gleiche wie in meinem obigen Beispiel. – CuriousMind