友人が404を取り扱うだけでなく、500エラーが発生するだけでなく、エレガントな解決に向けて、私を指摘しました。実際、すべてのエラーを処理します。重要なのは、すべてのエラーが例外を生成し、ラックミドルウェアのスタックを介して上方に伝播し、そのいずれかによって処理されるまでです。詳細を知りたい場合は、this excellent screencastをご覧ください。 Railsには例外のハンドラがありますが、文書化されていないexceptions_app
設定オプションで上書きできます。
# In your config/application.rb
config.exceptions_app = self.routes
その後、あなたは自分のconfig/routes.rb
にこれらのルートを照合する必要があります:その後、
get "/404" => "errors#not_found"
get "/500" => "errors#exception"
そして、あなたさて、あなたはこのように、バックレールにルートエラーをすることができ、独自のミドルウェアを書いたりすることができますこれを処理するコントローラを作成するだけです。
class ErrorsController < ActionController::Base
def not_found
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "not-found"}.to_json, :status => 404
else
render :text => "404 Not found", :status => 404 # You can render your own template here
end
end
def exception
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "internal-server-error"}.to_json, :status => 500
else
render :text => "500 Internal Server Error", :status => 500 # You can render your own template here
end
end
end
最後に一つ追加する:開発環境では、404または500ページをレンダリングしませんusallyレール代わりにバックトレースを出力します。 ErrorsController
が開発モードで動作していることを確認するには、config/enviroments/development.rb
ファイルのバックトレースの内容を無効にします。
config.consider_all_requests_local = false
また、ステータスコードをレンダラーに追加することを忘れないでください。そうしないと、クライアント/ブラウザは404/500であることを知りません。 レンダリング:text => "404 not found"、:ステータス=>:not_found – arnab
私は私の答えを編集しました。 – iblue
私はrespond_toブロックがレンダリング機能でより普遍的だと言うでしょう: respond_to do | format | format.json {エラー: "not-found"}。to_json、status:404} format.html {レンダリングテキスト: "404 Not found"、ステータス:404} end –