2016-05-11 14 views
2

私はActionController::RoutingErrorから救助しようとしていますが、動作させることができません。私はrescue_from ActionController::RoutingError in Rails 4を含む、私がオンラインで見つけることができるほとんどすべてを試しました。私はエラーコントローラとエラーページがあります。私はcancan access deniedRecordNotFoundを仕事に持っていますが、私はRoutingErrorを解決できます。rescue_from ActionController :: RoutingErrorは機能しません

はカンカンのために私はapplication_controller.rb

rescue_from CanCan::AccessDenied do 
    render template: 'errors/error_403', status: 403 
    end 

内でこれを使用して、私は私のルートでこれを持っている:私はRoutingErrorのために同じことを行う場合、それは動作しません

match "/404", to: "errors#error_404", via: :all 

私はまたmatch '*path', :to => "errors#error_404"を試しましたが、私はerorsを取得しました。

どうすればこの問題を解決できますか?

編集:私はアクセス用としてRoutingErrorのために同じことを行う場合は拒否された:それは動作しません

rescue_from ActionController::RoutingError do 
     render template: 'errors/error_404', status: 404 
    end 

答えて

10

Railsが要求とルートを照合しようとすると、ActionController::RoutingErrorが発生します。これは、レールが実際にアプリケーションを呼び出す前に発生します。そのため、ApplicationControllerは例外を救う機会がありません。

代わりに、Railsのデフォルトexceptions_appが登場します。これはラックセンスのアプリです。リクエストでENVハッシュを取り、レスポンスを返します。この場合はスタティック/public/404.htmlファイルです。あなたは何ができるか

は、あなたのRailsアプリは動的代わりにエラーページをレンダリング処理しています:

# config/application.rb 
config.exceptions_app = self.routes # a Rack Application 

# config/routes.rb 
match "/404", :to => "errors#not_found", :via => :all 
match "/500", :to => "errors#internal_server_error", :via => :all 

あなたは、セットアップのエラーページを処理するための特定のコントローラはなり - あなたのApplicationControllerにクラスでこれをしませんすべてのコントローラにnot_foundinternal_server_errorというメソッドを追加することになります。

class ErrorsController < ActionController::Base 
    protect_from_forgery with: :null_session 

    def not_found 
    render(status: 404) 
    end 

    def internal_server_error 
    render(status: 500) 
    end 
end 

Matt Brictson: Dynamic Rails Error Pagesからコードを借りて - それを完全に参照してください。

+0

このような丁寧な答えをありがとうございます。今私はそれをよく理解しています。 –

関連する問題