aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2010-06-07 20:54:53 -0400
committerDavid Heinemeier Hansson <david@loudthinking.com>2010-06-08 14:47:02 -0400
commit585f8f27b190637fd0bad67d7d611eed5ae262e7 (patch)
treef072f100c847d275c1e079eb7fdeb8ff4ed1498b
parenteb69721c9bf2bd0f8957a231ecc91080b0645b84 (diff)
downloadrails-585f8f27b190637fd0bad67d7d611eed5ae262e7.tar.gz
rails-585f8f27b190637fd0bad67d7d611eed5ae262e7.tar.bz2
rails-585f8f27b190637fd0bad67d7d611eed5ae262e7.zip
Fixed double output from cache in no caching mode
-rw-r--r--actionpack/lib/action_view/helpers/cache_helper.rb28
-rw-r--r--actionpack/test/controller/caching_test.rb15
2 files changed, 14 insertions, 29 deletions
diff --git a/actionpack/lib/action_view/helpers/cache_helper.rb b/actionpack/lib/action_view/helpers/cache_helper.rb
index a904af56bb..8251ed18f4 100644
--- a/actionpack/lib/action_view/helpers/cache_helper.rb
+++ b/actionpack/lib/action_view/helpers/cache_helper.rb
@@ -32,27 +32,27 @@ module ActionView
# <i>Topics listed alphabetically</i>
# <% end %>
def cache(name = {}, options = nil, &block)
- safe_concat fragment_for(name, options, &block)
+ if controller.perform_caching
+ safe_concat(fragment_for(name, options, &block))
+ else
+ yield
+ end
+
nil
end
private
# TODO: Create an object that has caching read/write on it
def fragment_for(name = {}, options = nil, &block) #:nodoc:
- if controller.perform_caching
- if controller.fragment_exist?(name, options)
- controller.read_fragment(name, options)
- else
- # VIEW TODO: Make #capture usable outside of ERB
- # This dance is needed because Builder can't use capture
- pos = output_buffer.length
- yield
- fragment = output_buffer.slice!(pos..-1)
- controller.write_fragment(name, fragment, options)
- end
+ if controller.fragment_exist?(name, options)
+ controller.read_fragment(name, options)
else
- ret = yield
- ActiveSupport::SafeBuffer.new(ret) if ret.is_a?(String)
+ # VIEW TODO: Make #capture usable outside of ERB
+ # This dance is needed because Builder can't use capture
+ pos = output_buffer.length
+ yield
+ fragment = output_buffer.slice!(pos..-1)
+ controller.write_fragment(name, fragment, options)
end
end
end
diff --git a/actionpack/test/controller/caching_test.rb b/actionpack/test/controller/caching_test.rb
index 4431eb2e2a..c161bea945 100644
--- a/actionpack/test/controller/caching_test.rb
+++ b/actionpack/test/controller/caching_test.rb
@@ -644,21 +644,6 @@ class FragmentCachingTest < ActionController::TestCase
assert_equal 'will not expire ;-)', @store.read('views/primalgrasp')
end
- def test_fragment_for_with_disabled_caching
- @controller.perform_caching = false
-
- @store.write('views/expensive', 'fragment content')
- fragment_computed = false
-
- view_context = @controller.view_context
-
- buffer = 'generated till now -> '.html_safe
- buffer << view_context.send(:fragment_for, 'expensive') { fragment_computed = true }
-
- assert fragment_computed
- assert_equal 'generated till now -> ', buffer
- end
-
def test_fragment_for
@store.write('views/expensive', 'fragment content')
fragment_computed = false