From c255e0eed5849ed7866d3c5999a4e04a0e625b9c Mon Sep 17 00:00:00 2001
From: Santiago Pastorino <santiago@wyeworks.com>
Date: Mon, 5 Sep 2011 06:10:12 -0700
Subject: Merge pull request #2799 from tomstuart/3-1-stable

Never return stored content from content_for when a block is given
---
 .../lib/action_view/helpers/capture_helper.rb      |  6 ++--
 actionpack/test/template/capture_helper_test.rb    | 36 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/actionpack/lib/action_view/helpers/capture_helper.rb b/actionpack/lib/action_view/helpers/capture_helper.rb
index 62f95379cd..8abd85c3a3 100644
--- a/actionpack/lib/action_view/helpers/capture_helper.rb
+++ b/actionpack/lib/action_view/helpers/capture_helper.rb
@@ -134,9 +134,9 @@ module ActionView
       # WARNING: content_for is ignored in caches. So you shouldn't use it
       # for elements that will be fragment cached.
       def content_for(name, content = nil, &block)
-        content = capture(&block) if block_given?
-        if content
-          @view_flow.append(name, content)
+        if content || block_given?
+          content = capture(&block) if block_given?
+          @view_flow.append(name, content) if content
           nil
         else
           @view_flow.get(name)
diff --git a/actionpack/test/template/capture_helper_test.rb b/actionpack/test/template/capture_helper_test.rb
index a9157e711c..13e2d5b595 100644
--- a/actionpack/test/template/capture_helper_test.rb
+++ b/actionpack/test/template/capture_helper_test.rb
@@ -46,6 +46,42 @@ class CaptureHelperTest < ActionView::TestCase
     assert_equal "bar", content_for(:bar)
   end
 
+  def test_content_for_with_multiple_calls
+    assert ! content_for?(:title)
+    content_for :title, 'foo'
+    content_for :title, 'bar'
+    assert_equal 'foobar', content_for(:title)
+  end
+
+  def test_content_for_with_block
+    assert ! content_for?(:title)
+    content_for :title do
+      output_buffer << 'foo'
+      output_buffer << 'bar'
+      nil
+    end
+    assert_equal 'foobar', content_for(:title)
+  end
+
+  def test_content_for_with_whitespace_block
+    assert ! content_for?(:title)
+    content_for :title, 'foo'
+    content_for :title do
+      output_buffer << "  \n  "
+      nil
+    end
+    content_for :title, 'bar'
+    assert_equal 'foobar', content_for(:title)
+  end
+
+  def test_content_for_returns_nil_when_writing
+    assert ! content_for?(:title)
+    assert_equal nil, content_for(:title, 'foo')
+    assert_equal nil, content_for(:title) { output_buffer << 'bar'; nil }
+    assert_equal nil, content_for(:title) { output_buffer << "  \n  "; nil }
+    assert_equal 'foobar', content_for(:title)
+  end
+
   def test_content_for_question_mark
     assert ! content_for?(:title)
     content_for :title, 'title'
-- 
cgit v1.2.3