酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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

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

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


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

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

1
2
3
4
5
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にエラー発生時のためのメソッドを追加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 の部分を以下のように変更。

1
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エラー発生時のユーザーの印象を改善できると思います。ぜひチャレンジしてみて下さい!

Special Thanks

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を追記

おすすめの書籍