Permalink
Browse files

Added defaults to respond_to [DHH]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3842 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
dhh committed Mar 12, 2006
1 parent 6e3e5ca commit de660957a50227ef71a7c16524ccec2c45b980b5
View
@@ -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
@@ -13,6 +13,13 @@ def respond_to(&block)
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 @@ def initialize(block_binding)
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
@@ -31,12 +31,30 @@ def just_xml
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 @@ def test_js_or_anything
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
@@ -184,6 +184,14 @@ def @template.name() nil end
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 @@ def test_yield_content_for
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
@@ -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 @@ def test_accessing_local_assigns_in_inline_template_with_string_keys
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
@@ -0,0 +1 @@
+Hello world!
@@ -0,0 +1 @@
+page[:body].visual_effect :highlight
@@ -0,0 +1 @@
+xml.p "Hello world!"

0 comments on commit de66095

Please sign in to comment.