diff --git a/app/controllers/errors_controller.rb b/app/controllers/errors_controller.rb new file mode 100644 index 000000000..d4e41f481 --- /dev/null +++ b/app/controllers/errors_controller.rb @@ -0,0 +1,28 @@ +class ErrorsController < ApplicationController + before_action :set_error_message + + def show + render :show, status: @status_code + end + + private + + def set_error_message + @status_code = params[:status_code].to_i + + case @status_code + when 404 + @title = "ページが見つかりませんでした... 🥺💦" + @desc = "ページが削除された可能性があります 🤔💭" + when 422 + @title = "リクエストが処理できませんでした… 😢" + @desc = "入力内容に誤りがあるか、リクエストが正しく送信されなかった可能性があります。" + when 500 + @title = "予期しないエラーが発生しました 😵‍💫" + @desc = "申し訳ありません。サーバーで問題が発生しています。" + else + @title = "予期せぬエラーが発生しました…😵" + @desc = "しばらく経ってから再度お試しください。" + end + end +end diff --git a/app/views/errors/internal_server_error.json.jbuilder b/app/views/errors/internal_server_error.json.jbuilder deleted file mode 100644 index 46a32f671..000000000 --- a/app/views/errors/internal_server_error.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.error_message "We're sorry, but something went wrong." diff --git a/app/views/errors/not_found.json.jbuilder b/app/views/errors/not_found.json.jbuilder deleted file mode 100644 index a323a2abe..000000000 --- a/app/views/errors/not_found.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.error_message "The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved." diff --git a/app/views/errors/not_found.html.erb b/app/views/errors/show.html.erb similarity index 51% rename from app/views/errors/not_found.html.erb rename to app/views/errors/show.html.erb index 2cd2898ed..48437e6b2 100644 --- a/app/views/errors/not_found.html.erb +++ b/app/views/errors/show.html.erb @@ -1,5 +1,5 @@ -<% provide(:title, "ページが見つかりませんでした... 🥺💦") %> -<% provide(:desc, "ページが削除された可能性があります 🤔💭") %> +<% provide(:title, @title) %> +<% provide(:desc, @desc) %>
@@ -9,18 +9,18 @@
-

- ページが見つかりませんでした... 🥺💦 -

+

<%= @title %>

- ページが削除された可能性があります 🤔💭 + <%= @desc %>

フィードバックなどあれば info@coderdojo.jp にメールしていただくか、
もしくは - GitHub Issue + + GitHub Issue + に書いていただけると嬉しいです (>人< )✨

@@ -28,11 +28,22 @@

- 🐣 最近の情報発信 + + 🐣 最近の情報発信 +


- +
- -
+ + diff --git a/app/views/errors/unprocessable_entity.json.jbuilder b/app/views/errors/unprocessable_entity.json.jbuilder deleted file mode 100644 index 81302a2a0..000000000 --- a/app/views/errors/unprocessable_entity.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.error_message "The change you wanted was rejected. Maybe you tried to change something you didn't have access to." diff --git a/config/environments/production.rb b/config/environments/production.rb index ce610264c..50c92b542 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -12,6 +12,9 @@ # Full error reports are disabled. config.consider_all_requests_local = false + # 本番環境では例外を自前ルーティングへ + config.exceptions_app = self.routes + # Turn on fragment caching in view templates. config.action_controller.perform_caching = true diff --git a/config/environments/test.rb b/config/environments/test.rb index e0f4be7d9..09ca29a17 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -22,6 +22,9 @@ config.consider_all_requests_local = true config.cache_store = :null_store + # テスト環境でも例外を自前ルーティングへ + config.exceptions_app = self.routes + # Render exception templates for rescuable exceptions and raise for other exceptions. config.action_dispatch.show_exceptions = :rescuable diff --git a/config/routes.rb b/config/routes.rb index a999d47cb..9341e2a53 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -105,4 +105,21 @@ # Check development sent emails mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development? + mount Rambulance::Engine => "/" + + # 全環境共通のエラーページルーティング + %w(404 422 500 ).each do |code| + match code, to: "errors#show", via: :all, defaults: { status_code: code } + end + + # 開発/テスト環境のみの便利ルート ── + if Rails.env.development? || Rails.env.test? + # 500エラーを意図的に発生させる + get "/trigger_500", to: ->(env) { raise "Triggering 500 error" } + # 422エラーを意図的に返す + get "/trigger_422", to: "errors#unprocessable_entity" + # Rambulance を開発/テスト環境でのみマウント + mount Rambulance::Engine => "/" + end + end diff --git a/spec/requests/errors_spec.rb b/spec/requests/errors_spec.rb index d32860644..9b568327b 100644 --- a/spec/requests/errors_spec.rb +++ b/spec/requests/errors_spec.rb @@ -4,12 +4,28 @@ include Rambulance::TestHelper describe "Error requests" do - it 'should render a corresponding error page' do + it 'renders the 404 error page' do with_exceptions_app do get '/does_not_exist' end + expect(response.status).to eq(404) + expect(response.body).to include("子どものためのプログラミング道場") + end - assert_equal 404, response.status + it 'renders the 422 error page' do + with_exceptions_app do + get '/trigger_422' + end + expect(response.status).to eq(422) + expect(response.body).to include("子どものためのプログラミング道場") + end + + it 'renders the 500 error page' do + with_exceptions_app do + get '/trigger_500' + end + expect(response.status).to eq(500) + expect(response.body).to include("子どものためのプログラミング道場") end end end