mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Return a valid Rack response from bare ActionController::Metal
This commit is contained in:
parent
edb5991a14
commit
1dacc19702
3 changed files with 35 additions and 14 deletions
|
@ -76,7 +76,7 @@ module AbstractController
|
|||
# :api: plugin
|
||||
def render_to_string(options={})
|
||||
_normalize_options(options)
|
||||
AbstractController::Rendering.body_to_s(render_to_body(options))
|
||||
render_to_body(options)
|
||||
end
|
||||
|
||||
# Find and renders a template based on the options given.
|
||||
|
@ -90,18 +90,6 @@ module AbstractController
|
|||
controller_path
|
||||
end
|
||||
|
||||
# Return a string representation of a Rack-compatible response body.
|
||||
def self.body_to_s(body)
|
||||
if body.respond_to?(:to_str)
|
||||
body
|
||||
else
|
||||
strings = []
|
||||
body.each { |part| strings << part.to_s }
|
||||
body.close if body.respond_to?(:close)
|
||||
strings.join
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# This method should return a hash with assigns.
|
||||
|
|
|
@ -38,7 +38,8 @@ module ActionController
|
|||
delegate :session, :to => "@_request"
|
||||
|
||||
def initialize(*)
|
||||
@_headers = {}
|
||||
@_headers = {"Content-Type" => "text/html"}
|
||||
@_status = 200
|
||||
super
|
||||
end
|
||||
|
||||
|
@ -70,6 +71,11 @@ module ActionController
|
|||
@_status = Rack::Utils.status_code(status)
|
||||
end
|
||||
|
||||
def response_body=(val)
|
||||
body = val.respond_to?(:each) ? val : [val]
|
||||
super body
|
||||
end
|
||||
|
||||
# :api: private
|
||||
def dispatch(name, request)
|
||||
@_request = request
|
||||
|
|
27
actionpack/test/controller/new_base/bare_metal_test.rb
Normal file
27
actionpack/test/controller/new_base/bare_metal_test.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
require "abstract_unit"
|
||||
|
||||
module BareMetalTest
|
||||
class BareController < ActionController::Metal
|
||||
def index
|
||||
self.response_body = "Hello world"
|
||||
end
|
||||
end
|
||||
|
||||
class BareTest < ActiveSupport::TestCase
|
||||
test "response body is a Rack-compatible response" do
|
||||
status, headers, body = BareController.action(:index).call(Rack::MockRequest.env_for("/"))
|
||||
assert_equal 200, status
|
||||
string = ""
|
||||
|
||||
body.each do |part|
|
||||
assert part.is_a?(String), "Each part of the body must be a String"
|
||||
string << part
|
||||
end
|
||||
|
||||
assert headers.is_a?(Hash), "Headers must be a Hash"
|
||||
assert headers["Content-Type"], "Content-Type must exist"
|
||||
|
||||
assert_equal "Hello world", string
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue