diff options
author | Jeff Kreeftmeijer <jeff@kreeftmeijer.nl> | 2016-05-19 15:20:03 +0200 |
---|---|---|
committer | Jeff Kreeftmeijer <jeff@kreeftmeijer.nl> | 2016-06-03 16:04:12 +0200 |
commit | f650e0324207e46ed5240380e60bdf1e2a5023a6 (patch) | |
tree | 5710e74cda20c0dd07f0cf67c933d01ffad992d7 /actionpack/lib/abstract_controller | |
parent | 4e85538dddf47877cacc65cea6c050e349af0405 (diff) | |
download | rails-f650e0324207e46ed5240380e60bdf1e2a5023a6.tar.gz rails-f650e0324207e46ed5240380e60bdf1e2a5023a6.tar.bz2 rails-f650e0324207e46ed5240380e60bdf1e2a5023a6.zip |
Use `#performed?` to terminate controller callbacks
Since 69009f, `ActionController::Metal::DataStreaming#send_file` doesn't
set `@_response_body` anymore.
`AbstractController::Callbacks` used `@_response_body` in its callback
terminator, so it failed to halt the callback cycle when using `#send_file`
from a `before_action`.
Instead, it now uses `#performed?` on `AbstractController::Base` and
`ActionController::Metal`, which checks `response.committed?`, besides
checking if `@_response_body` is set, if possible.
Example application: https://gist.github.com/jeffkreeftmeijer/78ae4572f36b198e729724b0cf79ef8e
Diffstat (limited to 'actionpack/lib/abstract_controller')
-rw-r--r-- | actionpack/lib/abstract_controller/base.rb | 7 | ||||
-rw-r--r-- | actionpack/lib/abstract_controller/callbacks.rb | 2 |
2 files changed, 8 insertions, 1 deletions
diff --git a/actionpack/lib/abstract_controller/base.rb b/actionpack/lib/abstract_controller/base.rb index d4317399ed..aa06f70433 100644 --- a/actionpack/lib/abstract_controller/base.rb +++ b/actionpack/lib/abstract_controller/base.rb @@ -150,6 +150,13 @@ module AbstractController _find_action_name(action_name) end + # Tests if a response body is set. Used to determine if the + # +process_action+ callback needs to be terminated in + # +AbstractController::Callbacks+. + def performed? + response_body + end + # Returns true if the given controller is capable of rendering # a path. A subclass of +AbstractController::Base+ # may return false. An Email controller for example does not diff --git a/actionpack/lib/abstract_controller/callbacks.rb b/actionpack/lib/abstract_controller/callbacks.rb index d63ce9c1c3..3ef8da86fa 100644 --- a/actionpack/lib/abstract_controller/callbacks.rb +++ b/actionpack/lib/abstract_controller/callbacks.rb @@ -9,7 +9,7 @@ module AbstractController included do define_callbacks :process_action, - terminator: ->(controller, result_lambda) { result_lambda.call if result_lambda.is_a?(Proc); controller.response_body }, + terminator: ->(controller, result_lambda) { result_lambda.call if result_lambda.is_a?(Proc); controller.performed? }, skip_after_callbacks_if_terminated: true end |