我有以下代码:
unless Rails.application.config.consider_all_requests_local
rescue_from Exception, with: :render_exception
rescue_from ActiveRecord::RecordNotFound, with: :render_exception
rescue_from ActionController::UnknownController, with: :render_exception
rescue_from ::AbstractController::ActionNotFound, with: :render_exception
rescue_from ActiveRecord::ActiveRecordError, with: :render_exception
rescue_from NoMethodError, with: :render_exception
end
它们都完美无缺,除了:: AbstractController :: ActionNotFound
我也试过
AbstractController::ActionNotFound
ActionController::UnknownAction
错误:
AbstractController::ActionNotFound (The action 'show' could not be found for ProductsController):
答案 0 :(得分:7)
This similar question表示您无法再捕获ActionNotFound
例外情况。检查链接以获取解决方法。 This suggestion使用Rack中间件来捕获404对我来说是最干净的。
答案 1 :(得分:3)
要在控制器中拯救AbstractController::ActionNotFound
,您可以尝试以下方法:
class UsersController < ApplicationController
private
def process(action, *args)
super
rescue AbstractController::ActionNotFound
respond_to do |format|
format.html { render :404, status: :not_found }
format.all { render nothing: true, status: :not_found }
end
end
public
# actions must not be private
end
这会覆盖引发process
的{{1}} AbstractController::Base
方法(请参阅source)。
答案 2 :(得分:0)
我认为我们应该在AbstractController::ActionNotFound
中抓住ApplicationController
。我已经尝试过似乎无法正常工作。
rescue_from ActionController::ActionNotFound, with: :action_not_found
我发现在ApplicationController
中处理此异常的方式更为清晰。要在应用程序中处理ActionNotFound
异常,您必须覆盖应用程序控制器中的action_missing
方法。
def action_missing(m, *args, &block)
Rails.logger.error(m)
redirect_to not_found_path # update your application 404 path here
end
解决方案改编自:coderwall handling exceptions in your rails application
答案 3 :(得分:0)
如Grégoire在他的回答中所述,覆盖process
似乎有效。但是,Rails代码改为覆盖process_action
。但这不起作用,因为在process_action
中检查了action_name,process
永远不会被调用。
https://github.com/rails/rails/blob/v3.2.21/actionpack/lib/abstract_controller/base.rb#L115
https://github.com/rails/rails/blob/v3.2.21/actionpack/lib/abstract_controller/base.rb#L161