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:
parent
4611d0e108
commit
19fbd84e12
2 changed files with 40 additions and 0 deletions
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue