diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2006-03-12 03:39:58 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2006-03-12 03:39:58 +0000 |
commit | de660957a50227ef71a7c16524ccec2c45b980b5 (patch) | |
tree | 6d864ad49e05350ebc6fc33d788edc5f1fc8ee72 | |
parent | 6e3e5cadfbd7db407364bf2571a5003cf3733480 (diff) | |
download | rails-de660957a50227ef71a7c16524ccec2c45b980b5.tar.gz rails-de660957a50227ef71a7c16524ccec2c45b980b5.tar.bz2 rails-de660957a50227ef71a7c16524ccec2c45b980b5.zip |
Added defaults to respond_to [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3842 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/mime_responds.rb | 21 | ||||
-rw-r--r-- | actionpack/test/controller/mime_responds_test.rb | 38 | ||||
-rw-r--r-- | actionpack/test/controller/new_render_test.rb | 19 | ||||
-rw-r--r-- | actionpack/test/controller/render_test.rb | 16 | ||||
-rw-r--r-- | actionpack/test/fixtures/respond_to/using_defaults.rhtml | 1 | ||||
-rw-r--r-- | actionpack/test/fixtures/respond_to/using_defaults.rjs | 1 | ||||
-rw-r--r-- | actionpack/test/fixtures/respond_to/using_defaults.rxml | 1 |
8 files changed, 79 insertions, 20 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index afe9a4e6bc..ff2315fc3c 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -7,7 +7,7 @@ @posts = Post.find :all respond_to do |type| - type.html { render } # renders weblog/index.rhtml + type.html # using defaults, which will render weblog/index.rhtml type.xml { render :action => "index.rxml" } type.js { render :action => "index.rjs" } end diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index 42b6e24205..e8d1ba089b 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -13,6 +13,13 @@ module ActionController #:nodoc: end class Responder #:nodoc: + DEFAULT_BLOCKS = { + :html => 'Proc.new { render }', + :js => 'Proc.new { render :action => "#{action_name}.rjs" }', + :xml => 'Proc.new { render :action => "#{action_name}.rxml" }', + :xml_arg => 'Proc.new { render :xml => __mime_responder_arg__ }' + } + def initialize(block_binding) @block_binding = block_binding @mime_type_priority = eval("request.accepts", block_binding) @@ -22,9 +29,19 @@ module ActionController #:nodoc: for mime_type in %w( all html js xml rss atom yaml ) eval <<-EOT - def #{mime_type}(&block) + def #{mime_type}(argument = nil, &block) @order << Mime::#{mime_type.upcase} - @responses[Mime::#{mime_type.upcase}] = block + + if block_given? + @responses[Mime::#{mime_type.upcase}] = block + else + if argument + eval("__mime_responder_arg__ = " + (argument.is_a?(String) ? "'" + argument + "'" : argument), @block_binding) + @responses[Mime::#{mime_type.upcase}] = eval(DEFAULT_BLOCKS[(Mime::#{mime_type.upcase}.to_sym.to_s + "_arg").to_sym], @block_binding) + else + @responses[Mime::#{mime_type.upcase}] = eval(DEFAULT_BLOCKS[Mime::#{mime_type.upcase}.to_sym], @block_binding) + end + end end EOT end diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb index d78feb25e9..f2aa45a168 100644 --- a/actionpack/test/controller/mime_responds_test.rb +++ b/actionpack/test/controller/mime_responds_test.rb @@ -31,12 +31,30 @@ class RespondToController < ActionController::Base type.xml { render :text => "XML" } end end + + def using_defaults + respond_to do |type| + type.html + type.js + type.xml + end + end + + def using_argument_defaults + person_in_xml = { :name => "David" }.to_xml(:root => "person") + respond_to do |type| + type.html + type.xml(person_in_xml) + end + end def rescue_action(e) raise unless ActionController::MissingTemplate === e end end +RespondToController.template_root = File.dirname(__FILE__) + "/../fixtures/" + class MimeControllerTest < Test::Unit::TestCase def setup @request = ActionController::TestRequest.new @@ -99,4 +117,24 @@ class MimeControllerTest < Test::Unit::TestCase get :just_xml assert_equal 'XML', @response.body end + + def test_using_defaults + @request.env["HTTP_ACCEPT"] = "*/*" + get :using_defaults + assert_equal 'Hello world!', @response.body + + @request.env["HTTP_ACCEPT"] = "text/javascript" + get :using_defaults + assert_equal "$('body').visualEffect(\"highlight\");", @response.body + + @request.env["HTTP_ACCEPT"] = "application/xml" + get :using_defaults + assert_equal "<p>Hello world!</p>\n", @response.body + end + + def test_using_argument_defaults + @request.env["HTTP_ACCEPT"] = "application/xml" + get :using_argument_defaults + assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n <name>David</name>\n</person>\n", @response.body + end end
\ No newline at end of file diff --git a/actionpack/test/controller/new_render_test.rb b/actionpack/test/controller/new_render_test.rb index 8359e190a0..5bdb8ec7f8 100644 --- a/actionpack/test/controller/new_render_test.rb +++ b/actionpack/test/controller/new_render_test.rb @@ -184,6 +184,14 @@ class NewRenderTestController < ActionController::Base render :action => "potential_conflicts" end + def hello_world_from_rxml_using_action + render :action => "hello_world.rxml" + end + + def hello_world_from_rxml_using_template + render :template => "test/hello_world.rxml" + end + helper NewRenderTestHelper helper do def rjs_helper_method(value) @@ -560,4 +568,13 @@ EOS get :yield_content_for assert_equal "<title>Putting stuff in the title!</title>\n\nGreat stuff!\n", @response.body end -end + + + def test_overwritting_rendering_relative_file_with_extension + get :hello_world_from_rxml_using_template + assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body + + get :hello_world_from_rxml_using_action + assert_equal "<html>\n <p>Hello</p>\n</html>\n", @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 db6f71acc9..1ee77a549d 100644 --- a/actionpack/test/controller/render_test.rb +++ b/actionpack/test/controller/render_test.rb @@ -18,14 +18,6 @@ class TestController < ActionController::Base def hello_world end - def hello_world_from_rxml_using_action - render :action => "hello_world.rxml" - end - - def hello_world_from_rxml_using_template - render :template => "test/hello_world.rxml" - end - def render_hello_world render "test/hello_world" end @@ -251,12 +243,4 @@ class RenderTest < Test::Unit::TestCase get :accessing_local_assigns_in_inline_template_with_string_keys, :local_name => "Local David" assert_equal "Goodbye, Local David", @response.body end - - def test_overwritting_rendering_relative_file_with_extension - get :hello_world_from_rxml_using_template - assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body - - get :hello_world_from_rxml_using_action - assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body - end end diff --git a/actionpack/test/fixtures/respond_to/using_defaults.rhtml b/actionpack/test/fixtures/respond_to/using_defaults.rhtml new file mode 100644 index 0000000000..6769dd60bd --- /dev/null +++ b/actionpack/test/fixtures/respond_to/using_defaults.rhtml @@ -0,0 +1 @@ +Hello world!
\ No newline at end of file diff --git a/actionpack/test/fixtures/respond_to/using_defaults.rjs b/actionpack/test/fixtures/respond_to/using_defaults.rjs new file mode 100644 index 0000000000..469fcd8e15 --- /dev/null +++ b/actionpack/test/fixtures/respond_to/using_defaults.rjs @@ -0,0 +1 @@ +page[:body].visual_effect :highlight
\ No newline at end of file diff --git a/actionpack/test/fixtures/respond_to/using_defaults.rxml b/actionpack/test/fixtures/respond_to/using_defaults.rxml new file mode 100644 index 0000000000..598d62e2fc --- /dev/null +++ b/actionpack/test/fixtures/respond_to/using_defaults.rxml @@ -0,0 +1 @@ +xml.p "Hello world!"
\ No newline at end of file |