Если вам нужно обработать более одного конкретного исключения, используйте rescue_action или rescue_action_in_public , разница в том, чтобы перехватывать локальные запросы или нет (общая разработка / производство). Я предпочитаю использовать in_public , потому что необходимо просмотреть трассировку исключения в режиме разработки.
взгляните на мой исходный код:
class ApplicationController < ActionController::Base
include CustomExceptionsHandler
....
end
module CustomExceptionsHandler
# Redirect to login/dashboard path when Exception is caught
def rescue_action_in_public(exception)
logger.error("\n !!! Exception !!! \n #{exception.message} \n")
case exception.class.to_s
when "Task::AccessDenied"
logger.error(" !!! 403 !!!")
notify_hoptoad(exception) //catch this kind of notification to Hoptoad
render_403
when "AuthenticatedSystem::PermissionDenied"
logger.error(" !!! 403 !!!")
render_403
when "Task::MissingDenied"
logger.error(" !!! 404 !!!")
notify_hoptoad(exception)
render_404
when "ActionController::RoutingError"
logger.error(" !!! 404 !!!")
render_404
else
notify_hoptoad(exception)
redirect_to(current_user.nil? ? login_path : dashboard_path) and return false
end
end
private
#403 Forbidden
def render_403
respond_to do |format|
format.html { render :template => "common/403", :layout => false, :status => 403 }
format.xml { head 403 }
format.js { head 403 }
format.json { head 403 }
end
return false
end
#404 Not Found
def render_404
respond_to do |format|
format.html { render :template => "common/404", :layout => false, :status => 404 }
format.xml { head 404 }
format.js { head 404 }
format.json { head 404 }
end
return false
end
end