はじめに
コントローラでのエラーを取得、対応するために色々方法を考えていたのですが、そのなかで見つけたram bulanceというgemが簡単に実装するには良さそうだったので、作業のまとめ記事を書こうと思います。
環境
- rails 4.2
- ruby 2.2.2
- rambulance 0.3.1
使用まで
インストール
Gemfileに書きを追記しましす。
Gemfile
gem "rambulance"
以上でbundle installを行います。
railsへの適用
rails g でファイルを生成します。-eオプションでviewのテンプレートが選べるようだったので使用していた haml を入力しました。その他はerbとslimが選択できるようです。
generating templates:
create app/views/errors/bad_request.html.haml
create app/views/errors/forbidden.html.haml
create app/views/errors/internal_server_error.html.haml
create app/views/errors/not_found.html.haml
create app/views/errors/unprocessable_entity.html.haml
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
create app/views/errors/unprocessable_entity.json.jbuilder
copying app/views/layouts/application.html.haml to app/views/layouts/error.html.haml:
create app/views/layouts/error.html.haml
generating initializer:
create config/initializers/rambulance.rb
設定の変更
config/initializers/rambulance.rb を編集します。
config.rescue_responses = {
ActionController::RoutingError => :not_found,
AbstractController::ActionNotFound => :not_found,
ActionController::BadRequest => :bad_request,
"Hosting::Task::Base::DrubyNotRunningError" => :internal_server_error,
"Hosting::Task::Base::AlreadyExistError" => :internal_server_error,
"CustomersController::DrubyNotWorkingError" => :internal_server_error,
}
# view/layout内から使用するテンプレートファイル
config.layout_name = 'application'
ハッシュの中によく使いそうなエラーと独自に作成したエラーを残しました。
layoutは他のページと同様のものを使用するのでapplication/にあるとレイアウトファイルをそのまま使用するように設定しました。
また、開発環境でもエラーを確認できるように
config.consider_all_requests_local = false
を設定しています。
エラーの内容をページに表示
上記でだいたい整ったので最後に、もしもエラーが有った際にエラークラスを表示できるようにしました。
.dialog
%div
%h1 Internal Server Error
%p
申し訳ありません、下記の理由で実行を停止しました。
%br/
サーバ管理者に確認をして下さい。
%pre
【エラーメッセージ】
%br/
- if $!
= "[Error] #{$!.class}" # error class
%br/
= "[Message] #{$!}" # message
%br/
= "#{$@}" # error trace
%br/
- else
メッセージはありません。
とても雑だけど、$!で発生した種類の障害をクラスとメッセージで表示、もう一個の$@で詳細で其の際のログを大量に出します。こちらでやりたいことが満たせました。
最後に
エラー処理はめんどくさいイメージでしたが、クラス同士で結びつけたりよく発生するエラーがあればそれを流せるレールがあることで、エラー処理をあまりやって来なかった自分にもなんとか導入出来ました。