Rails 5の404/500エラーページ、簡単作成手順


Railsアプリケーションで簡単に自分で作った404/500エラーページを表示させる手順です。404/500エラーページもユーザービリティの面やコンバージョンの面で非常に重要ですよね!

あるRailsアプリケーションでルーティング系のエラーはルートにリダイレクトするようにしていたのですが、SEO的にはNGだと知りました。
ソフト404エラー』と呼ばれており、ルーティングがないのに404ステータスを返さないのは検索エンジンさん的にはなはだそうです。
ということで、Webサービスを作るときにはルーティングと、エラー時の挙動をしっかり制御したほうがいいと反省中です。


🐞 routes.rbのルーティングの修正

config/routes.rb のルーティングのブロックの最後に以下を追加

Rails.application.routes.draw do
# blockの最後に以下を追加
get '*not_found' => 'application#routing_error'
post '*not_found' => 'application#routing_error'
end

🐠 ApplicationControllerにエラー発生時のメソッドを追加

app/controllers/application_controller.rbにエラー発生時のためのメソッドを追加。

class ApplicationController < ActionController::Base
# 例外ハンドル
unless Rails.env.development?
rescue_from Exception, with: :_render_500
rescue_from ActiveRecord::RecordNotFound, with: :_render_404
rescue_from ActionController::RoutingError, with: :_render_404
end

def routing_error
raise ActionController::RoutingError, params[:path]
end

private

def _render_404(e = nil)
logger.info "Rendering 404 with exception: #{e.message}" if e

if request.format.to_sym == :json
render json: { error: '404 error' }, status: :not_found
else
render 'errors/404', status: :not_found
end
end

def _render_500(e = nil)
logger.error "Rendering 500 with exception: #{e.message}" if e
Airbrake.notify(e) if e # Airbrake/Errbitを使う場合はこちら

if request.format.to_sym == :json
render json: { error: '500 error' }, status: :internal_server_error
else
render 'errors/500', status: :internal_server_error
end
end
end

errors/error_404errors/error_500 は動的にページを生成する場合の設定方法です。ちなみに静的なページにしたい場合は上のコードの render の部分を次のように変更。

render file: Rails.root.join('public/404.html'), status: 404, layout: false, content_type: 'text/html'

🎳 カスタムエラー用のViewの作成

app/views/errors/error_404.html.hamlapp/views/errors/error_500.html.haml を作成して404/500エラー時のViewを作成。

たったこれだけで、404/500エラー発生時のユーザーの印象を改善できると思います。ぜひチャレンジしてみてください!

🍄 参考リンク

Railsでカスタムな404エラーのページを出力する方法 - memo.yomukaku.net

Rails3の全体的な例外ハンドル - Tiempo

http status code 404 - How to redirect to a 404 in Rails? - Stack Overflow

🗻 更新履歴

(2013-12-07 15:40) 変なフォーマットを指定された時の対応
(2017-02-01 16:37) routesを追記

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍