diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 040d1162ad468..9797f244104a1 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,10 @@ *SVN* +* Added that render :xml will try to call to_xml if it can [DHH]. Makes these work: + + render :xml => post + render :xml => comments + * Added :location option to render so that the common pattern of rendering a response after creating a new resource is now a 1-liner [DHH] render :xml => post.to_xml, :status => :created, :location => post_url(post) diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index c0c91a3ac9b01..c1c9e57342d94 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -879,7 +879,7 @@ def render_javascript(javascript, status = nil, append_response = true) #:nodoc: def render_xml(xml, status = nil) #:nodoc: response.content_type = Mime::XML - render_text(xml, status) + render_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, status) end def render_json(json, callback = nil, status = nil) #:nodoc: diff --git a/actionpack/test/controller/new_render_test.rb b/actionpack/test/controller/new_render_test.rb index 0765772e061c5..18a32f6e30a16 100644 --- a/actionpack/test/controller/new_render_test.rb +++ b/actionpack/test/controller/new_render_test.rb @@ -258,6 +258,20 @@ def head_with_status_code_first head :forbidden, :x_custom_header => "something" end + def render_with_location + render :xml => "", :location => "http://example.com", :status => 201 + end + + def render_with_to_xml + to_xmlable = Class.new do + def to_xml + "" + end + end.new + + render :xml => to_xmlable + end + helper NewRenderTestHelper helper do def rjs_helper_method(value) @@ -742,4 +756,14 @@ def test_head_with_status_code_first assert_equal "something", @response.headers["X-Custom-Header"] assert_response :forbidden end -end + + def test_rendering_with_location_should_set_header + get :render_with_location + assert_equal "http://example.com", @response.headers["Location"] + end + + def test_rendering_xml_should_call_to_xml_if_possible + get :render_with_to_xml + assert_equal "", @response.body + end +end \ No newline at end of file diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb index eb23ed0c5b614..d51af51454593 100644 --- a/actionpack/test/controller/render_test.rb +++ b/actionpack/test/controller/render_test.rb @@ -73,10 +73,6 @@ def heading head :ok end - def location - render :xml => "", :location => "http://example.com", :status => 201 - end - def greeting # let's just rely on the template end @@ -372,11 +368,6 @@ def test_should_render_formatted_html_erb_template_with_faulty_accepts_header assert_equal 'passed formatted html erb', @response.body end - def test_rendering_with_location_should_set_header - get :location - assert_equal "http://example.com", @response.headers["Location"] - end - protected def assert_deprecated_render(&block)