복붙노트

[RUBY-ON-RAILS] rescue_from ActionController :: RoutingError 레일 4

RUBY-ON-RAILS

rescue_from ActionController :: RoutingError 레일 4

나는 다음과 같은 오류가있어 :

ActionController::RoutingError (No route matches [GET] "/images/favicon.ico")

나는 존재하지 않는 링크 error404 페이지를 표시 할.

나는 어떻게 달성 할 수 있습니까?

해결법

  1. ==============================

    1.application_controller.rb에 다음을 추가합니다 :

    application_controller.rb에 다음을 추가합니다 :

      # You want to get exceptions in development, but not in production.
      unless Rails.application.config.consider_all_requests_local
        rescue_from ActionController::RoutingError, with: -> { render_404  }
      end
    
      def render_404
        respond_to do |format|
          format.html { render template: 'errors/not_found', status: 404 }
          format.all { render nothing: true, status: 404 }
        end
      end
    

    나는 보통 또한 예외를 다음과 같은 구조, 그러나 그것은 당신에게 달려 있습니다 :

    rescue_from ActionController::UnknownController, with: -> { render_404  }
    rescue_from ActiveRecord::RecordNotFound,        with: -> { render_404  }
    

    오류 컨트롤러를 만들기 :

    class ErrorsController < ApplicationController
      def error_404
        render 'errors/not_found'
      end
    end
    

    그리고 routes.rb에서

      unless Rails.application.config.consider_all_requests_local
        # having created corresponding controller and action
        get '*path', to: 'errors#error_404', via: :all
      end
    

    그리고 마지막 것은 / 뷰 / 오류에 따라 (또는 당신이 사용하는 어떤 템플릿 엔진) not_found.html.haml 만드는 것입니다 / :

      %span 404
      %br
      Page Not Found
    
  2. ==============================

    2.@Andrey Deineko는 솔루션 만 conrtoller 내부에 수동으로 제기 된 RoutingErrors에 대한 작동하는 것 같다. 나는의 URL을 my_app 그것을 시도 할 경우 / not_existing_path, 난 여전히 표준 오류 메시지가 표시됩니다.

    @Andrey Deineko는 솔루션 만 conrtoller 내부에 수동으로 제기 된 RoutingErrors에 대한 작동하는 것 같다. 나는의 URL을 my_app 그것을 시도 할 경우 / not_existing_path, 난 여전히 표준 오류 메시지가 표시됩니다.

    나는 레일 전에 오류가 발생하기 때문에 응용 프로그램도, 컨트롤러에 도달하지 않기 때문이다 같아요.

    나를 위해 문제를 해결 비결은 경로의 끝에 다음 줄을 추가했다 :

    Rails.application.routes.draw do
      # existing paths
      match '*path' => 'errors#error_404', via: :all
    end
    

    모든하지 미리 정의 된 요청을 잡을 수 있습니다.

    그런 다음 ErrorsController에 당신은 HTML, JSON ... 요청을 처리하기 위해 respond_to를 사용할 수 있습니다 :

    class ErrorsController < ApplicationController
      def error_404
        @requested_path = request.path
        repond_to do |format|
          format.html
          format.json { render json: {routing_error: @requested_path} }
        end
      end
    end
    
  3. ==============================

    3.응용 프로그램 / 자산 / 이미지의 복사 파비콘 이미지는 나를 위해 일했다.

    응용 프로그램 / 자산 / 이미지의 복사 파비콘 이미지는 나를 위해 일했다.

  4. from https://stackoverflow.com/questions/25841377/rescue-from-actioncontrollerroutingerror-in-rails-4 by cc-by-sa and MIT license