22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

railsのエラーページをrambulanceでハンドリング

Posted at

はじめに

コントローラでのエラーを取得、対応するために色々方法を考えていたのですが、そのなかで見つけた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/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
    メッセージはありません。

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

最後に

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

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?