спасение от: 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