5
6

More than 5 years have passed since last update.

Rails で PG::ConnectBad エラーを捕捉して画面表示する

Last updated at Posted at 2014-04-19

課題

Rails + postgresql で Rail アプリが起動中に postgresql が停止してしまった場合、productio モード、development モードでこんな画面が出る。

production モード

uncatch_error.png

develoment モード

development.png

development 時は これでもよいが、production モードの画面は、カスタマイズしたい場合がある。
こんな画面にする例を作ってみる。

カスタマイズしたエラー画面

catch_error.png

実装ポイント

  • 実装例は https://github.com/katoy/rails-canvas に置いた。

  • Postgresql 接続のエラーは controller 部ではキャッチできない。
    そこで、 rake middleware に PG::ConnectioBad 例外をキャッチする rack アプリを登録する。
    その rack アプリでは、サイトの画面テンプレートでレイアウトした画面を表示する。

  • config/application.rb

    • class DatabaseFailure を登録する。
    • これを 次のようにして登録する。
application.rb
config.middleware.insert_before ActiveRecord::ConnectionAdapters::ConnectionManagement, ActionDispatch::Rescue do
      rescue_from PG::ConnectionBad, DatabaseFailure
    end

変更と加える前の rake middleware の出力結果と、変更後の rake middleware の出力結果を比較する。

Rescue アプリが追加された事がわかる。

  • 変更前
...
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
...
  • 変更後
...
use ActionDispatch::Callbacks
use ActionDispatch::Rescue
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
...

動作確認

  • postgressqlを稼働させる。rake s で rails アプリを稼働させる。
    (postgresql が 未稼働だと、rails 開始時にエラーになってしまう。)
  • rails を稼働させる。
$ bundle install
$ bundle exec rake db:drop db:create db:migrate db:fixtures:load
$ rails s

http://localhost:3000 に web browser でアクセスして、正常な画面が出る事を確認する。
- その状態で、 postgresql を停止する。
- 再度、 http://localhost:3000 にアクセスする。
カスタマイズした画面が出ることが確認できる。

参考

...
例えばMySQLを使っていてデータベースサーバに接続できない場合、
ActiveRecord::ConnectionAdapters::ConnectionManagementというmiddlewareから
Mysql2::Errorが発生します。
...
つまり、どうやってもアプリケーションではrescueできません。
...
Rack middlewareで発生した例外はActionDispatch::Rescueというmiddlewareで捕捉できます。ActionDispatch::ShowExceptionsと違い、ActionDispatch::Rescueは例外クラスに対してハンドリングするRackアプリケーションを指定できます。
...

5
6
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
5
6