rescue_from :: AbstractController :: ActionNotFound无效

时间:2012-11-17 17:33:17

标签: ruby-on-rails exception ruby-on-rails-3.2 actioncontroller

我有以下代码:

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):

4 个答案:

答案 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