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/test | |
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/test')
-rw-r--r-- | actionpack/test/controller/send_file_test.rb | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/actionpack/test/controller/send_file_test.rb b/actionpack/test/controller/send_file_test.rb index 2820425c31..9df70dacbf 100644 --- a/actionpack/test/controller/send_file_test.rb +++ b/actionpack/test/controller/send_file_test.rb @@ -11,6 +11,8 @@ class SendFileController < ActionController::Base include ActionController::Testing layout "layouts/standard" # to make sure layouts don't interfere + before_action :file, only: :file_from_before_action + attr_writer :options def options @options ||= {} @@ -20,6 +22,10 @@ class SendFileController < ActionController::Base send_file(file_path, options) end + def file_from_before_action + raise 'No file sent from before action.' + end + def test_send_file_headers_bang options = { :type => Mime[:png], @@ -192,6 +198,15 @@ class SendFileTest < ActionController::TestCase assert_nil @controller.headers['Content-Disposition'] end + def test_send_file_from_before_action + response = nil + assert_nothing_raised { response = process('file_from_before_action') } + assert_not_nil response + + assert_kind_of String, response.body + assert_equal file_data, response.body + end + %w(file data).each do |method| define_method "test_send_#{method}_status" do @controller.options = { :stream => false, :status => 500 } |