diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index 140209a225e3e19f599472653100b4d330c1ce05..d492b6c258c9da6c9c99d3f7d1534363513e0aa5 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -5,9 +5,11 @@ def self.included(base) end module InstanceMethods - def respond_to(&block) + def respond_to(*types, &block) + raise ArgumentError, "respond_to takes either types or a block, never bot" unless types.any? ^ block + block ||= lambda { |responder| types.each { |type| responder.send(type) } } responder = Responder.new(block.binding) - yield responder + block.call(responder) responder.respond end end diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb index a2b8eaad60b685a886a3a51b4b9142b15691545a..640bc900a062add24a1277251574377ae156bf95 100644 --- a/actionpack/test/controller/mime_responds_test.rb +++ b/actionpack/test/controller/mime_responds_test.rb @@ -40,6 +40,10 @@ def using_defaults end end + def using_defaults_with_type_list + respond_to(:html, :js, :xml) + end + def using_argument_defaults person_in_xml = { :name => "David" }.to_xml(:root => "person") respond_to do |type| @@ -155,6 +159,20 @@ def test_using_defaults assert_equal "

Hello world!

\n", @response.body end + def test_using_defaults_with_type_list + @request.env["HTTP_ACCEPT"] = "*/*" + get :using_defaults_with_type_list + assert_equal 'Hello world!', @response.body + + @request.env["HTTP_ACCEPT"] = "text/javascript" + get :using_defaults_with_type_list + assert_equal '$("body").visualEffect("highlight");', @response.body + + @request.env["HTTP_ACCEPT"] = "application/xml" + get :using_defaults_with_type_list + assert_equal "

Hello world!

\n", @response.body + end + def test_using_argument_defaults @request.env["HTTP_ACCEPT"] = "application/xml" get :using_argument_defaults