aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2008-01-03 15:28:36 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2008-01-03 15:28:36 +0000
commitd5645fd4a0b8160646e69273626a77badd9ab1a4 (patch)
tree5759f8c4f78632c77f997cf3370911d53ba464de
parent7b8ee2438f95f41d0770b110cdab3253832b1848 (diff)
downloadrails-d5645fd4a0b8160646e69273626a77badd9ab1a4.tar.gz
rails-d5645fd4a0b8160646e69273626a77badd9ab1a4.tar.bz2
rails-d5645fd4a0b8160646e69273626a77badd9ab1a4.zip
Fixed rendering of partials with layout when done from site layout (closes #9209) [antramm]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8541 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_view/base.rb16
-rw-r--r--actionpack/test/controller/new_render_test.rb27
-rw-r--r--actionpack/test/fixtures/layouts/block_with_layout.erb3
-rw-r--r--actionpack/test/fixtures/layouts/partial_with_layout.erb3
5 files changed, 45 insertions, 6 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 520e92119f..bbac76bc8c 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fixed rendering of partials with layout when done from site layout #9209 [antramm]
+
* Fix atom_feed_helper to comply with the atom spec. Closes #10672 [xaviershay]
* The tags created do not contain a date (http://feedvalidator.org/docs/error/InvalidTAG.html)
diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 0f966addb6..6fde9ccf73 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -338,11 +338,13 @@ If you are rendering a subtemplate, you must now use controller-like partial syn
path, partial_name = partial_pieces(options.delete(:layout))
if block_given?
- @content_for_layout = capture(&block)
- concat(render(options.merge(:partial => "#{path}/#{partial_name}")), block.binding)
+ wrap_content_for_layout capture(&block) do
+ concat(render(options.merge(:partial => "#{path}/#{partial_name}")), block.binding)
+ end
else
- @content_for_layout = render(options)
- render(options.merge(:partial => "#{path}/#{partial_name}"))
+ wrap_content_for_layout render(options) do
+ render(options.merge(:partial => "#{path}/#{partial_name}"))
+ end
end
elsif options[:file]
render_file(options[:file], options[:use_full_path], options[:locals])
@@ -441,6 +443,12 @@ If you are rendering a subtemplate, you must now use controller-like partial syn
end
private
+ def wrap_content_for_layout(content)
+ original_content_for_layout = @content_for_layout
+ @content_for_layout = content
+ returning(yield) { @content_for_layout = original_content_for_layout }
+ end
+
def find_full_template_path(template_path, extension)
file_name = "#{template_path}.#{extension}"
base_path = find_base_path_for(file_name)
diff --git a/actionpack/test/controller/new_render_test.rb b/actionpack/test/controller/new_render_test.rb
index 4c0b9d0c9c..d8364a6a0b 100644
--- a/actionpack/test/controller/new_render_test.rb
+++ b/actionpack/test/controller/new_render_test.rb
@@ -361,10 +361,18 @@ class NewRenderTestController < ActionController::Base
render :action => "calling_partial_with_layout"
end
+ def render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
+ render :action => "calling_partial_with_layout"
+ end
+
def render_using_layout_around_block
render :action => "using_layout_around_block"
end
+ def render_using_layout_around_block_in_main_layout_and_within_content_for_layout
+ render :action => "using_layout_around_block"
+ end
+
def rescue_action(e) raise end
private
@@ -387,6 +395,10 @@ class NewRenderTestController < ActionController::Base
"layouts/builder"
when "action_talk_to_layout", "layout_overriding_layout"
"layouts/talk_from_action"
+ when "render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout"
+ "layouts/partial_with_layout"
+ when "render_using_layout_around_block_in_main_layout_and_within_content_for_layout"
+ "layouts/block_with_layout"
end
end
end
@@ -825,9 +837,20 @@ EOS
get :render_call_to_partial_with_layout
assert_equal "Before (David)\nInside from partial (David)\nAfter", @response.body
end
-
+
+ def test_render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
+ get :render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
+ assert_equal "Before (Anthony)\nInside from partial (Anthony)\nAfter\nBefore (David)\nInside from partial (David)\nAfter\nBefore (Ramm)\nInside from partial (Ramm)\nAfter", @response.body
+ end
+
def test_using_layout_around_block
- get :using_layout_around_block
+ get :render_using_layout_around_block
assert_equal "Before (David)\nInside from block\nAfter", @response.body
end
+
+ def test_using_layout_around_block_in_main_layout_and_within_content_for_layout
+ get :render_using_layout_around_block_in_main_layout_and_within_content_for_layout
+ assert_equal "Before (Anthony)\nInside from first block in layout\nAfter\nBefore (David)\nInside from block\nAfter\nBefore (Ramm)\nInside from second block in layout\nAfter\n", @response.body
+ end
+
end
diff --git a/actionpack/test/fixtures/layouts/block_with_layout.erb b/actionpack/test/fixtures/layouts/block_with_layout.erb
new file mode 100644
index 0000000000..6a8b41914b
--- /dev/null
+++ b/actionpack/test/fixtures/layouts/block_with_layout.erb
@@ -0,0 +1,3 @@
+<% render(:layout => "layout_for_partial", :locals => { :name => "Anthony" }) do %>Inside from first block in layout<% end %>
+<%= yield %>
+<% render(:layout => "layout_for_partial", :locals => { :name => "Ramm" }) do %>Inside from second block in layout<% end %>
diff --git a/actionpack/test/fixtures/layouts/partial_with_layout.erb b/actionpack/test/fixtures/layouts/partial_with_layout.erb
new file mode 100644
index 0000000000..a0349d731e
--- /dev/null
+++ b/actionpack/test/fixtures/layouts/partial_with_layout.erb
@@ -0,0 +1,3 @@
+<%= render( :layout => "layout_for_partial", :partial => "partial_for_use_in_layout", :locals => {:name => 'Anthony' } ) %>
+<%= yield %>
+<%= render( :layout => "layout_for_partial", :partial => "partial_for_use_in_layout", :locals => {:name => 'Ramm' } ) %> \ No newline at end of file