From 011e4694107f294e2b57cd885f9917205fccdcff Mon Sep 17 00:00:00 2001 From: Pratik Naik Date: Fri, 7 Mar 2008 11:17:05 +0000 Subject: Make MimeResponds::Responder#any work without explicit types. Closes #11140 [jaw6] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8987 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/mime_responds.rb | 8 +++-- actionpack/test/controller/mime_responds_test.rb | 36 +++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 7583eb9de2..131a9db0ae 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make MimeResponds::Responder#any work without explicit types. Closes #11140 [jaw6] + * Better error message for type conflicts when parsing params. Closes #7962 [spicycode, matt] * Remove unused ActionController::Base.template_class. Closes #10787 [Pratik] diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index 4ba4e626e2..a17782cafc 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -125,7 +125,7 @@ module ActionController #:nodoc: @order << mime_type - @responses[mime_type] = Proc.new do + @responses[mime_type] ||= Proc.new do @response.template.template_format = mime_type.to_sym @response.content_type = mime_type.to_s block_given? ? block.call : @controller.send(:render, :action => @controller.action_name) @@ -133,7 +133,11 @@ module ActionController #:nodoc: end def any(*args, &block) - args.each { |type| send(type, &block) } + if args.any? + args.each { |type| send(type, &block) } + else + custom(@mime_type_priority.first, &block) + end end def method_missing(symbol, &block) diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb index febdbd0993..c34643ddd5 100644 --- a/actionpack/test/controller/mime_responds_test.rb +++ b/actionpack/test/controller/mime_responds_test.rb @@ -107,6 +107,13 @@ class RespondToController < ActionController::Base type.any(:js, :xml) { render :text => "Either JS or XML" } end end + + def handle_any_any + respond_to do |type| + type.html { render :text => 'HTML' } + type.any { render :text => 'Whatever you ask for, I got it' } + end + end def all_types_with_layout respond_to do |type| @@ -335,6 +342,35 @@ class MimeControllerTest < Test::Unit::TestCase assert_equal 'Either JS or XML', @response.body end + def test_handle_any_any + @request.env["HTTP_ACCEPT"] = "*/*" + get :handle_any_any + assert_equal 'HTML', @response.body + end + + def test_handle_any_any_parameter_format + get :handle_any_any, {:format=>'html'} + assert_equal 'HTML', @response.body + end + + def test_handle_any_any_explicit_html + @request.env["HTTP_ACCEPT"] = "text/html" + get :handle_any_any + assert_equal 'HTML', @response.body + end + + def test_handle_any_any_javascript + @request.env["HTTP_ACCEPT"] = "text/javascript" + get :handle_any_any + assert_equal 'Whatever you ask for, I got it', @response.body + end + + def test_handle_any_any_xml + @request.env["HTTP_ACCEPT"] = "text/xml" + get :handle_any_any + assert_equal 'Whatever you ask for, I got it', @response.body + end + def test_rjs_type_skips_layout @request.env["HTTP_ACCEPT"] = "text/javascript" get :all_types_with_layout -- cgit v1.2.3