diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index f8d4057df585fdf8ab3cd4f2fce54dc38515327b..c91a0dcde7b2823dafe00dedc53d4b6796af9b40 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,13 @@ *SVN* +* Added that respond_to blocks will automatically set the content type to be the same as is requested [DHH]. Examples: + + respond_to do |format| + format.html { render :text => "I'm being sent as text/html" } + format.rss { render :text => "I'm being sent as application/rss+xml" } + format.atom { render :text => "I'm being sent as application/xml", :content_type => Mime::XML } + end + * Added utf-8 as the default charset for all renders. You can change this default using ActionController::Base.default_charset=(encoding) [DHH] * Added proper getters and setters for content type and charset [DHH]. Example of what we used to do: diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index 07bbbb473282ce30865930c5aa00e3ca116b7382..6c721f4ba2a47aa0c73aaa445dee7e607ce9f4e9 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -108,7 +108,7 @@ def respond_to(*types, &block) class Responder #:nodoc: DEFAULT_BLOCKS = [:html, :js, :xml].inject({}) do |blocks, ext| - blocks.update ext => %(Proc.new { render :action => "\#{action_name}.r#{ext}" }) + blocks.update ext => %(Proc.new { render :action => "\#{action_name}.r#{ext}", :content_type => Mime::#{ext.to_s.upcase} }) end def initialize(block_binding) @@ -129,7 +129,10 @@ def custom(mime_type, &block) @order << mime_type if block_given? - @responses[mime_type] = block + @responses[mime_type] = Proc.new do + eval "response.content_type = Mime::#{mime_type.to_sym.to_s.upcase}", @block_binding + block.call + end else if source = DEFAULT_BLOCKS[mime_type.to_sym] @responses[mime_type] = eval(source, @block_binding) diff --git a/actionpack/test/controller/content_type_test.rb b/actionpack/test/controller/content_type_test.rb index 71563ba9a666210c8f28c121f55e4a9319060c31..f2708acc0a3a992bc5a46b982d11ea834cab0a6a 100644 --- a/actionpack/test/controller/content_type_test.rb +++ b/actionpack/test/controller/content_type_test.rb @@ -30,6 +30,15 @@ def render_change_for_rxml render :action => "render_default_for_rxml" end + def render_default_content_types_for_respond_to + respond_to do |format| + format.html { render :text => "hello world!" } + format.xml { render :action => "render_default_content_types_for_respond_to.rhtml" } + format.js { render :text => "hello world!" } + format.rss { render :text => "hello world!", :content_type => Mime::XML } + end + end + def rescue_action(e) raise end end @@ -96,4 +105,26 @@ def test_change_for_rxml assert_equal Mime::HTML, @response.content_type assert_equal "utf-8", @response.charset end + + def test_render_default_content_types_for_respond_to + @request.env["HTTP_ACCEPT"] = Mime::HTML.to_s + get :render_default_content_types_for_respond_to + assert_equal Mime::HTML, @response.content_type + + @request.env["HTTP_ACCEPT"] = Mime::JS.to_s + get :render_default_content_types_for_respond_to + assert_equal Mime::JS, @response.content_type + end + + def test_render_default_content_types_for_respond_to_with_template + @request.env["HTTP_ACCEPT"] = Mime::XML.to_s + get :render_default_content_types_for_respond_to + assert_equal Mime::XML, @response.content_type + end + + def test_render_default_content_types_for_respond_to_with_overwrite + @request.env["HTTP_ACCEPT"] = Mime::RSS.to_s + get :render_default_content_types_for_respond_to + assert_equal Mime::XML, @response.content_type + end end \ No newline at end of file diff --git a/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml b/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml new file mode 100644 index 0000000000000000000000000000000000000000..25dc746886c84049487c57a1c095fcabbe72cbe1 --- /dev/null +++ b/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml @@ -0,0 +1 @@ +world \ No newline at end of file