2010-11-19 4 views
2

やあみんな、 私はrails3で動作するようにラックミドルウェアNotFoundを作るしようとしているが、私はいくつかのJSONを返すようにいくつかの変更を行うために必要なので、私は基本的に新しいクラスを定義した: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 

私はこれを追加しました「アプリ/ミドルウェア/ not_found.rb」と私のapplication.rbファイルには、以下の行を追加するには上記のクラス:

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

、今...よく、それは私が期待どおりに動作...それは常に

を返します
{"error"=>"Endpoint Not Found"} 

ルータが故障した場合にのみ、どのように動作させることができますか?私はinsert_afterメソッドがあるのを見ましたが、Application.routesの後にそれを起こさせることはできません。

ps:私はrails3ルータで扱うことができますが、それは実験です。

ありがとうございます!

+0

代わりに、システムの代わりにレールを使用しないでください。それは少しのものより複雑です。 – shingara

+0

あなたは質問全体を読むべきです、私は終わりまで意味します... "ps:レール3ルータでそれを扱うことができることはわかっていますが、それは実験です、私はちょうど楽しみがある" – Mike

答えて

2

ルートが一致しない場合、Railsルータはすでに404応答を返します。そのレスポンスをカスタマイズしたい場合は、次のようにすることができます。

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

ちょっと、今私は気が気になりません:-) – Mike

+0

ミドルウェアとレスキューをApplicationControllerから使用することに利点があるかどうかは分かりますか? – Mike

+0

あなたは何を意味するのかよく分かりません。いくつかのコード例で新しい質問をすることができますか?しかし、一般的に、Railsに例外を処理させ、問題が起こったときに通知するように設定するのが最善の方法です。例については、hoptoadapp.comを参照してください。 – PreciousBodilyFluids

関連する問題