Merge branch 'master' into cherry

This commit is contained in:
Jeremy Kemper
2009-04-22 00:23:47 -07:00
6 changed files with 96 additions and 18 deletions

View File

@@ -40,7 +40,7 @@ module AbstractController
#
# :api: plugin
def render_to_string(options = {})
Rack::Utils.body_to_s(render_to_body(options)).to_ary.join
AbstractController::Renderer.body_to_s(render_to_body(options))
end
def _render_template(template, options)
@@ -49,6 +49,18 @@ module AbstractController
def view_paths() _view_paths 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
module ClassMethods
def append_view_path(path)

View File

@@ -1,3 +1,5 @@
require 'action_controller/abstract/renderer'
module ActionController
DEFAULT_RENDER_STATUS_CODE = "200 OK"
@@ -318,7 +320,7 @@ module ActionController
end
def render_to_string(options = {})
Rack::Utils.body_to_s(render_to_body(options)).to_ary.join
AbstractController::Renderer.body_to_s(render_to_body(options))
end
# Clears the rendered results, allowing for another render to be performed.

View File

@@ -400,22 +400,6 @@ class RescueControllerTest < ActionController::TestCase
assert_equal "RescueController::ResourceUnavailableToRescueAsString", @response.body
end
def test_rescue_dispatcher_exceptions
env = @request.env
env["action_controller.rescue.request"] = @request
env["action_controller.rescue.response"] = @response
RescueController.call_with_exception(env, ActionController::RoutingError.new("Route not found"))
assert_equal "no way", @response.body
end
def test_rescue_dispatcher_exceptions_without_request_set
@request.env['REQUEST_URI'] = '/no_way'
response = RescueController.call_with_exception(@request.env, ActionController::RoutingError.new("Route not found"))
assert_kind_of ActionDispatch::Response, response
assert_equal "no way", response.body
end
protected
def with_all_requests_local(local = true)
old_local, ActionController::Base.consider_all_requests_local =
@@ -537,3 +521,83 @@ class ControllerInheritanceRescueControllerTest < ActionController::TestCase
assert_response :created
end
end
class ApplicationController < ActionController::Base
rescue_from ActionController::RoutingError do
render :text => 'no way'
end
end
class RescueTest < ActionController::IntegrationTest
class TestController < ActionController::Base
class RecordInvalid < StandardError
def message
'invalid'
end
end
rescue_from RecordInvalid, :with => :show_errors
def foo
render :text => "foo"
end
def invalid
raise RecordInvalid
end
def b00m
raise 'b00m'
end
protected
def show_errors(exception)
render :text => exception.message
end
end
test 'normal request' do
with_test_routing do
get '/foo'
assert_equal 'foo', response.body
end
end
test 'rescue exceptions inside controller' do
with_test_routing do
get '/invalid'
assert_equal 'invalid', response.body
end
end
test 'rescue routing exceptions' do
assert_equal 1, ApplicationController.rescue_handlers.length
begin
with_test_routing do
get '/no_way'
assert_equal 'no way', response.body
end
ensure
ActionController::Base.rescue_handlers.clear
end
end
test 'unrescued exception' do
with_test_routing do
get '/b00m'
assert_match(/Action Controller: Exception caught/, response.body)
end
end
private
def with_test_routing
with_routing do |set|
set.draw do |map|
map.connect 'foo', :controller => "rescue_test/test", :action => 'foo'
map.connect 'invalid', :controller => "rescue_test/test", :action => 'invalid'
map.connect 'b00m', :controller => "rescue_test/test", :action => 'b00m'
end
yield
end
end
end