aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/mime_responds.rb21
-rw-r--r--actionpack/test/controller/mime_responds_test.rb38
-rw-r--r--actionpack/test/controller/new_render_test.rb19
-rw-r--r--actionpack/test/controller/render_test.rb16
-rw-r--r--actionpack/test/fixtures/respond_to/using_defaults.rhtml1
-rw-r--r--actionpack/test/fixtures/respond_to/using_defaults.rjs1
-rw-r--r--actionpack/test/fixtures/respond_to/using_defaults.rxml1
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