2010-11-19 8 views
2

Hey Jungs, Ich versuche, die Rack-Middleware NotFound arbeiten mit rails3 zu machen, aber ich brauchte einige Änderungen vornehmen einige json zurückzukehren, so dass ich im Grunde definiert eine neue Klasse:Wie verwende ich Rack Middleware mit Rails3?

class NotFound 

    def initialize(app, msg, content_type = "text/html") 
    @app = app 
    @content = msg 
    @length = msg.size.to_s 
    @content_type = content_type 
    end 

    def call(env) 
    [404, {'Content-Type' => @content_type, 'Content-Length' => @length}, @content] 
    end 
end 

ich diese hinzugefügt Klasse oben auf „app/Middleware/not_found.rb“ und diese Zeile unter meiner application.rb Datei hinzufügen:

config.middleware.use "NotFound", {:error => "Endpoint Not Found"}.to_json, "application/json" 

und jetzt ... na ja, es funktioniert wie ich erwartet hatte ... es immer wieder zurückkehren

Nun, wie kann ich es nur funktionieren, wenn der Router ausfällt? Ich habe gesehen, dass es eine insert_after-Methode gibt, kann aber nicht passieren, nach Application.routes

PS: Ich weiß, ich könnte damit umgehen mit dem Rails3-Router, aber es ist ein Experiment, ich habe nur ein bisschen Spaß :-)

Danke!

+0

warum nicht stattdessen System der Schienen stattdessen verwenden. Es ist komplizierter für kleine Dinge. – shingara

+0

sollten Sie die ganze Frage lesen, ich meine bis zum Ende ... "PS: Ich weiß, ich könnte damit umgehen mit dem Rails3 Router, aber es ist ein Experiment, ich habe nur Spaß" – Mike

Antwort

2

Der Rails-Router gibt bereits eine 404-Antwort zurück, wenn keine Routen übereinstimmen. Wenn Sie diese Antwort anpassen möchten, könnten Sie Folgendes tun:

class NotFound 
    def initialize(app, msg, content_type = "text/html") 
    @app = app 
    @content = msg 
    @length = msg.size.to_s 
    @content_type = content_type 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 

    if status == 404 
     [404, {'Content-Type' => @content_type, 'Content-Length' => @length}, @content] 
    else 
     [status, headers, body] 
    end 
    end 
end 
+0

Hey Danke für die Antwort, Ich fühle mich jetzt dumm :-) – Mike

+0

Wissen Sie, ob es einen Vorteil bei der Verwendung einer Middleware vs Rettung aus ApplicationController gibt? – Mike

+0

Nicht sicher, was du meinst. Vielleicht möchten Sie eine neue Frage mit einem Beispielcode stellen? Im Allgemeinen ist es jedoch am besten, dass Rails Ausnahmen behandelt und es nur so konfiguriert, dass es Sie informiert, wenn etwas schief läuft. Ein Beispiel finden Sie unter hoptoadapp.com. – PreciousBodilyFluids

Verwandte Themen