Rails で JSON 形式の 404 エラーを返す必要性
質問
私のRailsアプリには、通常のHTMLフロントエンドとJSON APIがあります。今、もし誰かが
/api/not_existent_method.json
を呼び出すと、デフォルトのHTML 404ページが返されます。これを次のようなものに変更する方法はないでしょうか。
{"error": "not_found"}
のようなものに変更し、HTMLフロントエンドのオリジナルの404ページはそのままにしておく方法はありますか?
どのように解決するのですか?
友人が、404エラーだけでなく500エラーも処理するエレガントなソリューションを教えてくれました。実際、これはすべてのエラーを処理します。重要なのは、すべてのエラーは例外を生成し、ラックのミドルウェアのスタックを介して、それらのいずれかによって処理されるまで上方に伝搬するということです。もっと詳しく知りたい方は、以下をご覧ください。
この素晴らしいスクリーンキャスト
. Railsには独自の例外ハンドラがありますが、あまり文書化されていない
exceptions_app
という設定オプションで上書きできます。これで、独自のミドルウェアを書くこともできますし、このようにエラーをrailsに送り返すこともできます。
# 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
最後にもう一つ付け加えると、開発環境では通常、railsは404や500ページをレンダリングせず、代わりにバックトレースを表示します。もし、あなたの
ErrorsController
の動作を確認したい場合は、バックトレースを無効にして
config/enviroments/development.rb
ファイルでのバックトレースを無効にします。
config.consider_all_requests_local = false
関連
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】Rails 4 RoutingError: ルートが一致しない[POST]。
-
[解決済み] RailsのRootディレクトリのパス?
-
[解決済み] ウェブパッカーがアプリケーションを見つけ出せない
-
[解決済み] どなたか、collection_selectをわかりやすく説明していただけませんか?
-
[解決済み] rails consoleを起動するとRailsのイニシャライザーが呼ばれる?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Railsで404にリダイレクトする方法とは?
-
[解決済み】Rails 4 認証トークン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み】コントローラでJSONをレンダリングする
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] rails erb フォームヘルパー options_for_select :selected
-
[解決済み] Devise Admin Roleの追加【終了しました
-
[解決済み] レイル 4 radio_button_tag default not selected
-
[解決済み] rails/rubyでgroup_byを使用する。