From d5645fd4a0b8160646e69273626a77badd9ab1a4 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 3 Jan 2008 15:28:36 +0000 Subject: 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 --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_view/base.rb | 16 +++++++++---- actionpack/test/controller/new_render_test.rb | 27 ++++++++++++++++++++-- .../test/fixtures/layouts/block_with_layout.erb | 3 +++ .../test/fixtures/layouts/partial_with_layout.erb | 3 +++ 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 actionpack/test/fixtures/layouts/block_with_layout.erb create mode 100644 actionpack/test/fixtures/layouts/partial_with_layout.erb 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 -- cgit v1.2.3