とある子育てパパの日記

とある子育てパパの日記です

Rails 5.0.0.1で404/エラーページを動的に出力する

結構調べたのでメモ

やりたいこと

  • 404ページとその他のエラーページを動的に表示させるようにする。
  • エラーページ出力時にSlackへエラーを通知する。

いじったファイル

# config/initializers/exceptions_app.rb

Rails.configuration.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }
# app/controllers/errors_controller.rb

class ErrorsController < ApplicationController
  SERVER_ERROR_VIEW_NAME = '5xx'

  def show
    status_cd = request.env['PATH_INFO'].delete!("/")

    if Rack::Utils::SYMBOL_TO_STATUS_CODE[:not_found].to_s === status_cd
      # 404
      view = status_cd
    else
      # 404以外
      view = SERVER_ERROR_VIEW_NAME

      ####################################
      # ここでSlackなどへエラーの通知をすればいいと思う
      # request.env['PATH_INFO'] => ステータスコード
      # request.env['action_dispatch.exception'].to_s => エラーの内容
      # request.env['action_dispatch.original_path'].to_s => リクエストパス
      ####################################

    end

    render view, layout: false, status: status_cd
  end
<!-- app/views/errors/5xx.html.erb -->
<h1>ページの表示に失敗しました</h1>
<!-- app/views/errors/404.html.erb -->
<h1>お探しのページが見つかりませんでした</h1>

補足

  • 開発環境では下記の設定をしないと404とエラーページが表示されないので注意
# config/environments/development.rb

config.consider_all_requests_local = false
  • 作成したErrosController内でlib/配下にあるSlack通知用のクラスを呼び出す為に下記の設定が必要だった。これはハマったconfig.autoload_paths << Rails.root.join("lib")だけじゃだめだった
# config/application.rb

config.eager_load_paths << Rails.root.join("lib")