箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

本番と同じエラー画面を出したい【Rails】

f:id:y_hakoiri:20191102121915j:plain

Railsでの開発中に本番同様のエラー画面が表示される様に設定を変更する方法について。

設定方法

config/environments/development.rb

# Show full error reports.
config.consider_all_requests_local = true

これを

# Show full error reports.
config.consider_all_requests_local = false

こうするだけ。

config/environments配下には各環境ごとの設定ファイルが置かれていて、development.rb以外にもproduction.rbtest.rbなどがある。

どのファイルにおいてもRails.application.configure do...endの中に各種設定に関する記述がされていて、例えば今回のエラー画面の他にも、キャッシュストアに何を使用するかとか、mailerの設定とか、環境ごとに指定することができる。

忘れずにやること

config配下の設定は変更されてもサーバー側が検知してくれるわけではないので、いじったあとはサーバーを起動し直さないと変更が反映されない。

$ bin/rails s

一度サーバーを切ってからまた立ち上げればOK。

...ということは、もちろんここの変更はgitにプッシュはできないわけだけど、開発のたびにtrueやfalseを切り替える必要もなく、変更した状態でサーバーを起動したらあとは元に戻しちゃえば良いのでとても楽。

エラーが起こった時の挙動

開発環境でエラーが発生すると、config.consider_all_requests_local = trueだった時にはエラー詳細画面がブラウザに出ていたが、falseに変えると「お客様向け」のエラー画面が出るようになる。

デフォルトは多分こんなやつ。

f:id:y_hakoiri:20200205135022p:plain

そうするとエラーの詳細が確認できないじゃん!!...ではなく、ログを見れば良い。

というか、こうした方が普段からログを見る癖がつくので多分良い。

ログを見ると、リクエストが走った時にどのテンプレートがrenderされて、オブジェクトの保存や編集をした時にどんなSQLが発行されて、みたいなことをきちんと理解できるようになるので、多分こっちの方が良い。N+1とかも気がつきやすい。

ちなみに

さっきのエラー画面はサーバーが用意してくれているとかではなく、これもRailsアプリケーションの中に用意されていて、そのファイルが呼ばれているだけ。

public配下にある500.htmlがそう。

public/500.html

<!DOCTYPE html>
<html>
<head>
  <title>We're sorry, but something went wrong (500)</title>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
  <!-- 長いので省略 -->
  </style>
</head>

<body>
  <!-- This file lives in public/500.html -->
  <div class="dialog">
    <div>
      <h1>We're sorry, but something went wrong.</h1>
    </div>
    <p>If you are the application owner check the logs for more information.</p>
  </div>
</body>
</html>

ちょっとスタイル変えたいとか文言変えたいって時はここをいじれば良し。

ちなみに、静的ファイルオンリーなのでテンプレートエンジンは使えない。データを持たせることはできないので注意。(HTML久しぶりに見た)

参考

Railsでブラウザ上のエラー表示をdevelopmentとproductionで同じにする - 破いて捨てたノート