aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorYehuda Katz <wycats@gmail.com>2008-12-26 12:29:44 -0800
committerYehuda Katz <wycats@gmail.com>2008-12-26 12:29:44 -0800
commit9b2da52914720d87d2c6d6d94f7fab6a86a70daf (patch)
tree9ddd76ed6c03e3a8c672b4b1214e4bd490670b6e /actionpack
parente4314d4362d288ff72cec5a5a9644a3a3cbf23af (diff)
parentdb5a98e6cbb88331a6ce484260e9cce9ba882bcd (diff)
downloadrails-9b2da52914720d87d2c6d6d94f7fab6a86a70daf.tar.gz
rails-9b2da52914720d87d2c6d6d94f7fab6a86a70daf.tar.bz2
rails-9b2da52914720d87d2c6d6d94f7fab6a86a70daf.zip
Merge commit 'rails/master'
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG13
-rw-r--r--actionpack/lib/action_controller/base.rb16
-rw-r--r--actionpack/test/controller/render_test.rb49
3 files changed, 68 insertions, 10 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 5906ab1f16..a8abf48441 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,11 +1,16 @@
*2.3.0 [Edge]*
-* Make ActionController#render(string) work as a shortcut for render :file => string. [#1435] [Pratik Naik] Examples:
+* Make ActionController#render(string) work as a shortcut for render :file/:template/:action => string. [#1435] [Pratik Naik] Examples:
- # Instead of render(:file => '/Users/lifo/home.html.erb')
- render('/Users/lifo/home.html.erb')
+ # Instead of render(:action => 'other_action')
+ render('other_action') # argument has no '/'
+ render(:other_action)
+
+ # Instead of render(:template => 'controller/action')
+ render('controller/action') # argument must not begin with a '/', but contain a '/'
- Note : Filename must begin with a forward slash ('/')
+ # Instead of render(:file => '/Users/lifo/home.html.erb')
+ render('/Users/lifo/home.html.erb') # argument must begin with a '/'
* Add :prompt option to date/time select helpers. #561 [Sam Oliver]
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index 9bf044b6c0..5b83494eb4 100644
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -859,16 +859,20 @@ module ActionController #:nodoc:
def render(options = nil, extra_options = {}, &block) #:doc:
raise DoubleRenderError, "Can only render or redirect once per action" if performed?
- validate_render_arguments(options, extra_options)
+ validate_render_arguments(options, extra_options, block_given?)
if options.nil?
- return render(:file => default_template, :layout => true)
+ options = { :template => default_template.filename, :layout => true }
elsif options == :update
options = extra_options.merge({ :update => true })
- elsif options.is_a?(String)
- case options.index('/')
+ elsif options.is_a?(String) || options.is_a?(Symbol)
+ case options.to_s.index('/')
when 0
extra_options[:file] = options
+ when nil
+ extra_options[:action] = options
+ else
+ extra_options[:template] = options
end
options = extra_options
@@ -1189,8 +1193,8 @@ module ActionController #:nodoc:
end
end
- def validate_render_arguments(options, extra_options)
- if options && options != :update && !options.is_a?(String) && !options.is_a?(Hash)
+ def validate_render_arguments(options, extra_options, has_block)
+ if options && (has_block && options != :update) && !options.is_a?(String) && !options.is_a?(Hash) && !options.is_a?(Symbol)
raise RenderError, "You called render with invalid options : #{options.inspect}"
end
diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb
index f2393e695a..5fd41d8eec 100644
--- a/actionpack/test/controller/render_test.rb
+++ b/actionpack/test/controller/render_test.rb
@@ -81,6 +81,10 @@ class TestController < ActionController::Base
render :action => "hello_world"
end
+ def render_action_hello_world_as_string
+ render "hello_world"
+ end
+
def render_action_hello_world_with_symbol
render :action => :hello_world
end
@@ -202,6 +206,11 @@ class TestController < ActionController::Base
render :template => "test/hello"
end
+ def render_xml_hello_as_string_template
+ @name = "David"
+ render "test/hello"
+ end
+
def render_xml_with_custom_content_type
render :xml => "<blah/>", :content_type => "application/atomsvc+xml"
end
@@ -291,6 +300,14 @@ class TestController < ActionController::Base
render :action => "hello_world", :layout => "standard"
end
+ def layout_test_with_different_layout_and_string_action
+ render "hello_world", :layout => "standard"
+ end
+
+ def layout_test_with_different_layout_and_symbol_action
+ render :hello_world, :layout => "standard"
+ end
+
def rendering_without_layout
render :action => "hello_world", :layout => false
end
@@ -332,6 +349,10 @@ class TestController < ActionController::Base
render :template => "test/hello_world"
end
+ def render_with_explicit_string_template
+ render "test/hello_world"
+ end
+
def render_with_explicit_template_with_locals
render :template => "test/render_file_with_locals", :locals => { :secret => 'area51' }
end
@@ -654,6 +675,7 @@ class TestController < ActionController::Base
"accessing_params_in_template",
"accessing_params_in_template_with_layout",
"render_with_explicit_template",
+ "render_with_explicit_string_template",
"render_js_with_explicit_template",
"render_js_with_explicit_action_template",
"delete_with_js", "update_page", "update_page_with_instance_variables"
@@ -733,6 +755,12 @@ class RenderTest < ActionController::TestCase
assert_template "test/hello_world"
end
+ def test_render_action_hello_world_as_string
+ get :render_action_hello_world_as_string
+ assert_equal "Hello world!", @response.body
+ assert_template "test/hello_world"
+ end
+
def test_render_action_with_symbol
get :render_action_hello_world_with_symbol
assert_template "test/hello_world"
@@ -888,6 +916,12 @@ class RenderTest < ActionController::TestCase
assert_equal "application/xml", @response.content_type
end
+ def test_render_xml_as_string_template
+ get :render_xml_hello_as_string_template
+ assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
+ assert_equal "application/xml", @response.content_type
+ end
+
def test_render_xml_with_default
get :greeting
assert_equal "<p>This is grand!</p>\n", @response.body
@@ -1027,6 +1061,16 @@ class RenderTest < ActionController::TestCase
assert_equal "<html>Hello world!</html>", @response.body
end
+ def test_layout_test_with_different_layout_and_string_action
+ get :layout_test_with_different_layout_and_string_action
+ assert_equal "<html>Hello world!</html>", @response.body
+ end
+
+ def test_layout_test_with_different_layout_and_symbol_action
+ get :layout_test_with_different_layout_and_symbol_action
+ assert_equal "<html>Hello world!</html>", @response.body
+ end
+
def test_rendering_without_layout
get :rendering_without_layout
assert_equal "Hello world!", @response.body
@@ -1073,6 +1117,11 @@ class RenderTest < ActionController::TestCase
assert_response :success
end
+ def test_render_with_explicit_string_template
+ get :render_with_explicit_string_template
+ assert_equal "<html>Hello world!</html>", @response.body
+ end
+
def test_double_render
assert_raises(ActionController::DoubleRenderError) { get :double_render }
end