2014-05-06 41 views
0

我的代碼是在這裏捕捉所有類型的錯誤,並呈現軌404頁4

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    #before_filter :session_must_exist 
    protect_from_forgery with: :exception 

    helper_method :current_user, :back_url, :parent_url 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from Exception, :with => :method_missing 
    rescue_from ActiveRecord::RecordNotFound, :with => :method_missing 
    rescue_from AbstractController::ActionNotFound, :with => :method_missing 
    rescue_from ActionController::RoutingError, :with => :method_missing 
    rescue_from ActionController::UnknownController, :with => :method_missing 
    rescue_from ActionController::UnknownAction, :with => :method_missing 
    end 

    def method_missing(m, *args, &block) 
    Rails.logger.error(m) 
    redirect_to :controller=>"errors", :action=>"error_404" 
    render/redirect_to somewhere else 
    end 
end 

但它不是爲我工作。它給我們

AbstractController::ActionNotFound (The action 'show' could not be found for BuildInstallersController): 
    actionpack (4.0.0) lib/abstract_controller/base.rb:131:in `process' 
    actionpack (4.0.0) lib/abstract_controller/rendering.rb:44:in `process' 
    actionpack (4.0.0) lib/action_controller/metal.rb:195:in `dispatch' 
    actionpack (4.0.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
    actionpack (4.0.0) lib/action_controller/metal.rb:231:in `block in action' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `call' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `dispatch' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:48:in `call' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:71:in `block in call' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `each' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `call' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.r 
+0

什麼是Rails.application的'價值.config.consider_all_requests_local'? – BroiSatse

回答

0

的問題是,rescue_from只從控制器內發生的例外搶救和AbstractController::ActionNotFound是路由的問題,所以控制器進行實例化之前,復活。

你應該能夠做你需要什麼:

match '*a', :to => 'errors#error_404' 

添加爲最後一行到你的路線。

然而最優雅的解決方案是利用exception_apps像這樣:

# your environment file 
config.exceptions_app = ->(env) { ErrorsController.action(:error_404).call(env) } 
0

您可以捕捉所有的routes.rb文件,

if Rails.env.production? # if you want to use it for production environment only 
    %w{ 404 422 500 }.each do |err| 
     get err, to: "errors#error_#{err}" 
    end 
    end