2010-11-19 30 views
2

Hé les gars, Je suis en train de faire le middleware rack NotFound pour travailler avec rails3 mais je devais faire quelques changements pour revenir un peu JSON, donc je essentiellement défini une nouvelle classe:Comment utiliser le middleware rack avec 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 

J'ai ajouté ce classe ci-dessus pour « app/middleware/not_found.rb » et ajoutez cette ligne ci-dessous à mon dossier application.rb:

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

et maintenant ... eh bien, cela fonctionne comme je m'y attendais ... il retourne toujours

{"error"=>"Endpoint Not Found"} 

Maintenant, comment puis-je le faire fonctionner uniquement si le routeur tombe en panne? J'ai vu qu'il y a une méthode insert_after mais ne peut pas y arriver après Application.routes

ps: Je sais que je pourrais le gérer avec le routeur rails3, mais c'est une expérience, je vais juste m'amuser :-)

Merci!

+0

pourquoi ne pas utiliser le système de rails à la place. C'est plus compliqué pour les petites choses. – shingara

+0

vous devriez lire toute la question, je veux dire jusqu'à la fin ... "ps: Je sais que je pourrais le gérer avec le routeur rails3, mais c'est une expérience, je suis juste s'amuser" – Mike

Répondre

2

Le routeur Rails renvoie déjà une réponse 404 lorsqu'aucune route ne correspond. Si vous voulez personnaliser cette réponse, je suppose que vous pourriez faire:

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 Merci pour la réponse, Je me sens bête maintenant :-) – Mike

+0

Savez-vous s'il y a un avantage à utiliser un middleware vs rescue from dans ApplicationController? – Mike

+0

Vous ne savez pas ce que vous voulez dire. Vous voudrez peut-être poser une nouvelle question, avec un exemple de code? En général, cependant, il est préférable de laisser Rails gérer les exceptions, et de le configurer pour vous informer lorsque les choses tournent mal. Voir hoptoadapp.com pour un exemple. – PreciousBodilyFluids