спасение от: AbstractController::ActionNotFound не работает

у меня есть следующий код:

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 ответов


этот же вопрос говорит о том, что вы больше не можете поймать ActionNotFound исключения. Проверьте ссылку на обходные пути. предложение использовать промежуточное ПО стойки, чтобы поймать 404s выглядит самым чистым для меня.


спасти 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 метод AbstractController::Base поднимает AbstractController::ActionNotFound (см. источник).


Я думаю, мы должны поймать 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 обработки исключений в приложении rails


переопределение 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