Rails의 사용자 지정 오류 페이지

7037 단어 rubywebdevrails
이 게시물은 The Rails and Hotwire Codex에서 추출 및 수정되었습니다.

Rails에서 문제가 발생하면 사용자는 다소 지루한 기본 오류 페이지를 보게 됩니다.



이 페이지는 /public 폴더에 있으므로 Rails 스택을 통해 렌더링되지 않습니다.

이 페이지를 좀 더 멋지게 만들기 위해 Rails 인프라를 사용할 수 있도록 오류를 렌더링하는 컨트롤러를 만들 것입니다.

설정



공개 오류가 예외 및 스택 추적이 아닌 개발에서 렌더링되도록 구성을 변경해야 합니다.

# config/environments/development.rb
require "active_support/core_ext/integer/time"

Rails.application.configure do
  # ...

  config.consider_all_requests_local = false
end


컨트롤러를 만듭니다.

$ bin/rails g controller errors --no-helper --no-test-framework


이 컨트롤러에는 발생한 예외에 대한 오류 코드를 추출하고 적절한 보기를 렌더링하는 단일show 작업이 있습니다. 오류 코드 403 , 404500에는 전용 오류 페이지가 있으며 나머지는 404 페이지로 돌아갑니다.

class ErrorsController < ApplicationController
  layout "error"

  def show
    @exception = request.env["action_dispatch.exception"]
    @status_code = @exception.try(:status_code) ||
                   ActionDispatch::ExceptionWrapper.new(
                    request.env, @exception
                  ).status_code

    render view_for_code(@status_code), status: @status_code
  end

  private
    def view_for_code(code)
      supported_error_codes.fetch(code, "404")
    end

    def supported_error_codes
      {
        403 => "403",
        404 => "404",
        500 => "500"
      }
    end
end


보시다시피 맞춤형"error" 레이아웃도 사용하고 있습니다. 이 페이지는 단순하며 애플리케이션 레이아웃의 일반적인 수하물이 필요하지 않습니다.

새 오류 레이아웃을 만듭니다.

$ touch app/views/layouts/error.html.erb



<%# app/views/layouts/error.html.erb %>

<!DOCTYPE html>
<html>
  <head>
    <%= render "layouts/head" %>
  </head>

  <body>
    <main>
      <%= yield %>
    </main>
  </body>
</html>


보기를 만들고 원하는 대로 채웁니다.

$ touch app/views/errors/403.html.erb
$ touch app/views/errors/404.html.erb
$ touch app/views/errors/500.html.erb


이제 이 컨트롤러를 사용하여 오류를 렌더링하도록 Rails에 지시해야 합니다.

예외 앱



Rails는 exceptions_app 라는 구성 속성을 통해 사용자 지정 오류를 렌더링하는 후크를 제공합니다. 이 속성은 예외가 발생할 때 호출되는 Rack app을 할당해야 합니다.

모든 Rails 컨트롤러 작업은 실제로 자체 랙 애플리케이션입니다! 랙 끝점은 컨트롤러 클래스의 action 메서드에 의해 반환됩니다.

# ...

module MyApp
  class Application < Rails::Application
    config.load_defaults 7.0

    config.exceptions_app = ->(env) {
      ErrorsController.action(:show).call(env)
    }
  end
end


서버를 다시 시작한 다음 존재하지 않는 페이지를 방문하십시오. 또는 컨트롤러 작업에서 오류를 수동으로 트리거합니다. 사용자 정의 오류 페이지가 작동하는 것을 볼 수 있습니다!

이 게시물이 마음에 든다면 내 책The Rails and Hotwire Codex을 확인하여 Rails 및 Hotwire 기술을 레벨 업하십시오!

좋은 웹페이지 즐겨찾기