1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Rescuing in around_filters works as expected again [codahale, Stephan Kaes]. Closes #8341

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6810 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Tobias Lütke 2007-05-22 19:17:43 +00:00
parent 4611d0e108
commit 19fbd84e12
2 changed files with 40 additions and 0 deletions

View file

@ -713,6 +713,11 @@ module ActionController #:nodoc:
perform_action_without_filters unless performed? || aborted
return index if aborted || nesting != 0
# if an around filter catches an exception during rendering and handles it, e.g.
# by rendering an error page, we might have left over around filters in the filter
# chain. so skip over these.
index = index.next while (filter = chain[index]) && filter.type == :around
# run after filters, if any
while chain[index]
filter, index = skip_excluded_filters(chain, index)

View file

@ -324,6 +324,31 @@ class FilterTest < Test::Unit::TestCase
render :text => 'hello'
end
end
class ErrorToRescue < Exception; end
class RescuingAroundFilterWithBlock
def filter(controller)
begin
yield
rescue ErrorToRescue => ex
controller.send :render, :text => "I rescued this: #{ex.inspect}"
end
end
end
class RescuedController < ActionController::Base
around_filter RescuingAroundFilterWithBlock.new
def show
raise ErrorToRescue.new("Something made the bad noise.")
end
private
def rescue_action(exception)
raise exception
end
end
def test_empty_filter_chain
assert_equal 0, EmptyFilterChainController.filter_chain.size
@ -491,6 +516,16 @@ class FilterTest < Test::Unit::TestCase
def test_changing_the_requirements
assert_equal nil, test_process(ChangingTheRequirementsController, "go_wild").template.assigns['ran_filter']
end
def test_a_rescuing_around_filter
response = nil
assert_nothing_raised do
response = test_process(RescuedController)
end
assert response.success?
assert_equal("I rescued this: #<FilterTest::ErrorToRescue: Something made the bad noise.>", response.body)
end
private
def test_process(controller, action = "show")