はじめに

yuki24/rambulance で動的なエラーページを表示する方法についてまとめた。

TL;DR

  • Gemfilegem "rambulance" 追加 → bundle (or bundle install) でインストール
  • rails g rambulance:install でセットアップ
  • config/initializers/rambulance.rb"例外" => "対応ファイル" のペアを記述
  • app/views/errors/対応ファイル.html.xxx にエラーページの内容を記述
  • /rambulance/対応ファイル にアクセスすると、エラーページの内容が確認できる

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. rambulance について
    2. gem インストール
    3. 初期ファイルの生成
    4. 例外と表示内容のマッピング
      1. rescue_responses
      2. layout_name
      3. view_path
    5. エラーページの確認
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88

$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]

$ rails -v
Rails 5.2.3

$ bundle info rambulance
* rambulance (1.0.3)

詳細

rambulance について

動的にエラーページを生成できる gem。以下が嬉しいポイント。

  • エラー内容ごとに表示ページを変更できる
  • Ruby, Rails のメソッドが使える
    • image_tag
    • link_to
    • root_path
    • etc
  • アプリケーションの既存資産が使える
    • asset ファイル
    • テンプレートファイル(ヘッダー、フッター)
    • etc
  • 難しいことをせずに ActionController::RoutingError を捕捉できる

gem インストール

Gemfilegem "rambulance" を追加

1
2
...
gem "rambulance"

bundle (or bundle install) でインストール

1
2
3
4
5
6
$ bundle
...
Fetching rambulance 1.0.3
Installing rambulance 1.0.3
...
Bundle complete! xx Gemfile dependencies, xx gems now installed.

初期ファイルの生成

rails g rambulance:install で設定ファイルなどを生成。必要に応じて bundle exec を付与。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ rails g rambulance:install
generating templates:
create app/views/errors/unprocessable_entity.json.jbuilder
create app/views/errors/bad_request.json.jbuilder
create app/views/errors/forbidden.json.jbuilder
create app/views/errors/internal_server_error.json.jbuilder
create app/views/errors/not_found.json.jbuilder

copying app/views/layouts/application.html.slim to app/views/layouts/error.html.slim:
create app/views/layouts/error.html.slim

generating initializer:
create config/initializers/rambulance.rb

以下のファイルが生成される。

  • app/views/errors: エラー別の表示ファイル
  • app/views/layouts/error.html.xxxx: エラー用のレイアウトファイル(app/views/layouts/application.html.slim がコピーされる)
  • config/initializers/rambulance.rb: 設定ファイル、エラーと表示内容のマッピングなど

例外と表示内容のマッピング

config/initializers/rambulance.rb を編集する。config.rescue_responses がメインの設定箇所。

rescue_responses

"ActionController::RoutingError" => :not_found と記述することで、ActionController::RoutingError 発生時に app/views/errors/not_found.html.xxxx を表示してくれるようになる。

1
2
3
4
5
6
7
8
Rambulance.setup do |config|
config.rescue_responses = {
"ActionController::RoutingError" => :not_found,
"ActiveRecord::RecordNotFound" => :not_found,
}
config.layout_name = "error"
config.view_path = "errors"
end

config.rescue_responses のどれにも該当しない場合には、app/views/errors/internal_server_error.html.xxxx が使われる。

layout_name

config.layout_name = "hoge" とすると、レイアウトファイルとして app/views/layouts/hoge.html.xxxx が使われる。

view_path

config.view_path = "my_errors" とすると、ビューファイルを ``app/views/my_errors/` から探すようになる。

エラーページの確認

通常、development 環境だと、エラー発生時にはスタックトレースなどの情報が表示されるため、実際に表示されるエラーページを確認することはできない。

config/environments/development.rbconfig.consider_all_requests_local = false とすることで確認ができる。

1
2
3
Rails.application.configure do
config.consider_all_requests_local = false
end

しかし、これすらも面倒だし、下手したらエラーページの確認後に設定を削除し忘れる可能性がある。

rambulance では http://localhost/rambulance/not_found のように /rambulance/xxxx にアクセスすることで、設定変更や例外の意図的な生成なしに直接エラーページを確認できる。

参考: Local Development - yuki24/rambulance

まとめ

  • Gemfilegem "rambulance" 追加 → bundle (or bundle install) でインストール
  • rails g rambulance:install でセットアップ
  • config/initializers/rambulance.rb"例外" => "対応ファイル" のペアを記述
  • app/views/errors/対応ファイル.html.xxx にエラーページの内容を記述
  • /rambulance/対応ファイル にアクセスすると、エラーページの内容が確認できる

その他・メモ

high_voltage を使っているアプリで、以下のやり方を試したら既存の静的ページが表示されなくなったが、rambulance 使うと簡単にクリアできたので助かった。

参考文献

関連記事