답변

51

는 다음을 추가 :

# 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 

내가 일반적으로 또한 예외를 다음과 같은 구조를하지만, 그건 당신에게 달렸어요 : 그럼

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

:

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

는 오류 컨트롤러 만들기 in 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 (또는 당신이 사용하는 어떤 템플릿 엔진) /views/errors/ 아래 :

%span 404 
    %br 
    Page Not Found 
+4

이 레일 4.2.5에서 작동하지 않습니다. 컨트롤러 코드가 실행되기 전에 예외가 ActionDispatch에 의해 발생했기 때문에 그럴 것 같습니다. – depquid

+0

@depquid Rails 4.0.x의 시대에 썼지 만 Rails 4.2.5로 테스트했습니다 - 경로를 추가하지 않았고'errors_controller.rb'를 만들지 않았다고 가정합니다 :) 만약 그렇다면 - 더 이상 떠나야하는 이유가없는 한 downvote를 철회하십시오. –

+6

죄송합니다. 올바르게 경로를 설정하지 않았습니다. 하지만 액션에 직접 라우팅하는 경우'rescue_from ActionController :: RoutingError, with : -> {render_404} '이유는 무엇입니까? – depquid

2

나는이 오류가 발생했다. 내가 favicon 이미지app/assets/images에 복사했으며 나를 찾았습니다.

-2

@ Andrey Deineko, 해결책은 conrtoller 내에서 수동으로 제기 된 RoutingError에 대해서만 작동하는 것 같습니다. URL을 my_app/not_existing_path으로 시도해도 여전히 표준 오류 메시지가 표시됩니다.

레일스가 이전에 오류를 발생시키기 때문에 응용 프로그램이 컨트롤러에 도달하지 않았기 때문입니다.

날 경로의 에 다음 줄을 추가하는 것이었다에 대한 문제를 해결 trick

:

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 
+0

'@requested_path = request.path'와 그에 상응하는'format.json {render json : {routing_error : @requested_path}}'를 설명 할 수 있습니까? –

+0

방금 ​​템플릿에서'@ requested_path'를 사용했습니다 (error_404.html.haml). json에 관해서는, 만약 내가 아약스에 의해 예를 들어, 전체 페이지를 반환 싶지 않아요, 나는 반환 된 json을 요청할 수 있으며, 오류 메시지가 나타납니다 – Misu