Note

ram bulanceでのエラーハンドリング

はじめに

コントローラでのエラーを取得、対応するために色々方法を考えていたのですが、そのなかで見つけた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 を入力しました。

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 メッセージはありません。

とても雑だけど、$!で発生した種類の障害をクラスとメッセージで表示、もう一個の$@で詳細で其の際のログを大量に出します。こちらでやりたいことが満たせました。

最後に

エラー処理はめんどくさいですが、クラス同士で結びつけてよく発生するエラーがあればそれを流せるレールをつくれるのでエラー処理をあまりやって来なかった自分にもなんとか導入出来ました。