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")