提交 d3dd3847 编写于 作者: M Maxime Garcia

Don't catch all NameError to reraise as ActionController::RoutingError #22368

上级 eb0e8e21
......@@ -30,9 +30,9 @@ def serve(req)
controller = controller req
res = controller.make_response! req
dispatch(controller, params[:action], req, res)
rescue NameError => e
rescue ActionController::RoutingError
if @raise_on_name_error
raise ActionController::RoutingError, e.message, e.backtrace
raise
else
return [404, {'X-Cascade' => 'pass'}, []]
end
......@@ -42,6 +42,8 @@ def serve(req)
def controller(req)
req.controller_class
rescue NameError => e
raise ActionController::RoutingError, e.message, e.backtrace
end
def dispatch(controller, action, req, res)
......
......@@ -4592,3 +4592,44 @@ def test_positional_args_with_format_false
assert_equal '/en/posts/2014/12/13', archived_posts_path(2014, 12, 13)
end
end
class TestErrorsInController < ActionDispatch::IntegrationTest
class ::PostsController < ActionController::Base
def foo
nil.i_do_not_exist
end
def bar
NonExistingClass.new
end
end
Routes = ActionDispatch::Routing::RouteSet.new
Routes.draw do
get '/:controller(/:action)'
end
APP = build_app Routes
def app
APP
end
def test_legit_no_method_errors_are_not_caught
get '/posts/foo'
assert_equal 500, response.status
end
def test_legit_name_errors_are_not_caught
get '/posts/bar'
assert_equal 500, response.status
end
def test_legit_routing_not_found_responses
get '/posts/baz'
assert_equal 404, response.status
get '/i_do_not_exist'
assert_equal 404, response.status
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册