Skip to content

Commit

Permalink
Get buffer for fragment cache from template's @output_buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
josh committed Jul 15, 2008
1 parent 4f72feb commit aca246a
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 260 deletions.
2 changes: 2 additions & 0 deletions actionpack/CHANGELOG
Original file line number Original file line Diff line number Diff line change
@@ -1,5 +1,7 @@
*Edge* *Edge*


* Get buffer for fragment cache from template's @output_buffer [Josh Peek]

* Set config.action_view.warn_cache_misses = true to receive a warning if you perform an action that results in an expensive disk operation that could be cached [Josh Peek] * Set config.action_view.warn_cache_misses = true to receive a warning if you perform an action that results in an expensive disk operation that could be cached [Josh Peek]


* Refactor template preloading. New abstractions include Renderable mixins and a refactored Template class [Josh Peek] * Refactor template preloading. New abstractions include Renderable mixins and a refactored Template class [Josh Peek]
Expand Down
4 changes: 1 addition & 3 deletions actionpack/lib/action_controller/caching/fragments.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ def fragment_cache_key(key)
ActiveSupport::Cache.expand_cache_key(key.is_a?(Hash) ? url_for(key).split("://").last : key, :views) ActiveSupport::Cache.expand_cache_key(key.is_a?(Hash) ? url_for(key).split("://").last : key, :views)
end end


def fragment_for(block, name = {}, options = nil) #:nodoc: def fragment_for(buffer, name = {}, options = nil, &block) #:nodoc:
if perform_caching if perform_caching
buffer = yield

if cache = read_fragment(name, options) if cache = read_fragment(name, options)
buffer.concat(cache) buffer.concat(cache)
else else
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_view/helpers/cache_helper.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ module CacheHelper
# <i>Topics listed alphabetically</i> # <i>Topics listed alphabetically</i>
# <% end %> # <% end %>
def cache(name = {}, options = nil, &block) def cache(name = {}, options = nil, &block)
_last_render.handler.new(@controller).cache_fragment(block, name, options) @controller.fragment_for(output_buffer, name, options, &block)
end end
end end
end end
Expand Down
375 changes: 188 additions & 187 deletions actionpack/lib/action_view/helpers/prototype_helper.rb

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions actionpack/lib/action_view/template_handler.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -17,9 +17,5 @@ def compile(template)
def compilable? def compilable?
self.class.compilable? self.class.compilable?
end end

# Called by CacheHelper#cache
def cache_fragment(block, name = {}, options = nil)
end
end end
end end
7 changes: 1 addition & 6 deletions actionpack/lib/action_view/template_handlers/builder.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -9,15 +9,10 @@ def compile(template)
# ActionMailer does not have a response # ActionMailer does not have a response
"controller.respond_to?(:response) && controller.response.content_type ||= Mime::XML;" + "controller.respond_to?(:response) && controller.response.content_type ||= Mime::XML;" +
"xml = ::Builder::XmlMarkup.new(:indent => 2);" + "xml = ::Builder::XmlMarkup.new(:indent => 2);" +
"self.output_buffer = xml.target!;" +
template.source + template.source +
";xml.target!;" ";xml.target!;"
end end

def cache_fragment(block, name = {}, options = nil)
@view.fragment_for(block, name, options) do
eval('xml.target!', block.binding)
end
end
end end
end end
end end
6 changes: 0 additions & 6 deletions actionpack/lib/action_view/template_handlers/erb.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -51,12 +51,6 @@ def compile(template)
src = ::ERB.new(template.source, nil, erb_trim_mode, '@output_buffer').src src = ::ERB.new(template.source, nil, erb_trim_mode, '@output_buffer').src
"__in_erb_template=true;#{src}" "__in_erb_template=true;#{src}"
end end

def cache_fragment(block, name = {}, options = nil) #:nodoc:
@view.fragment_for(block, name, options) do
@view.response.template.output_buffer
end
end
end end
end end
end end
11 changes: 0 additions & 11 deletions actionpack/lib/action_view/template_handlers/rjs.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,17 +7,6 @@ def compile(template)
"controller.response.content_type ||= Mime::JS;" + "controller.response.content_type ||= Mime::JS;" +
"update_page do |page|;#{template.source}\nend" "update_page do |page|;#{template.source}\nend"
end end

def cache_fragment(block, name = {}, options = nil) #:nodoc:
@view.fragment_for(block, name, options) do
begin
debug_mode, ActionView::Base.debug_rjs = ActionView::Base.debug_rjs, false
eval('page.to_s', block.binding)
ensure
ActionView::Base.debug_rjs = debug_mode
end
end
end
end end
end end
end end
43 changes: 2 additions & 41 deletions actionpack/test/controller/caching_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ def test_fragment_for__with_disabled_caching
fragment_computed = false fragment_computed = false


buffer = 'generated till now -> ' buffer = 'generated till now -> '
@controller.fragment_for(Proc.new { fragment_computed = true }, 'expensive') { buffer } @controller.fragment_for(buffer, 'expensive') { fragment_computed = true }


assert fragment_computed assert fragment_computed
assert_equal 'generated till now -> ', buffer assert_equal 'generated till now -> ', buffer
Expand All @@ -566,50 +566,11 @@ def test_fragment_for
fragment_computed = false fragment_computed = false


buffer = 'generated till now -> ' buffer = 'generated till now -> '
@controller.fragment_for(Proc.new { fragment_computed = true }, 'expensive') { buffer} @controller.fragment_for(buffer, 'expensive') { fragment_computed = true }


assert !fragment_computed assert !fragment_computed
assert_equal 'generated till now -> fragment content', buffer assert_equal 'generated till now -> fragment content', buffer
end end

def test_cache_erb_fragment
@store.write('views/expensive', 'fragment content')
@controller.response.template.output_buffer = 'generated till now -> '

assert_equal( 'generated till now -> fragment content',
ActionView::TemplateHandlers::ERB.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
end

def test_cache_rxml_fragment
@store.write('views/expensive', 'fragment content')
xml = 'generated till now -> '
class << xml; def target!; to_s; end; end

assert_equal( 'generated till now -> fragment content',
ActionView::TemplateHandlers::Builder.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
end

def test_cache_rjs_fragment
@store.write('views/expensive', 'fragment content')
page = 'generated till now -> '

assert_equal( 'generated till now -> fragment content',
ActionView::TemplateHandlers::RJS.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
end

def test_cache_rjs_fragment_debug_mode_does_not_interfere
@store.write('views/expensive', 'fragment content')
page = 'generated till now -> '

begin
debug_mode, ActionView::Base.debug_rjs = ActionView::Base.debug_rjs, true
assert_equal( 'generated till now -> fragment content',
ActionView::TemplateHandlers::RJS.new(@controller).cache_fragment(Proc.new{ }, 'expensive'))
assert ActionView::Base.debug_rjs
ensure
ActionView::Base.debug_rjs = debug_mode
end
end
end end




Expand Down
2 changes: 2 additions & 0 deletions actionpack/test/template/javascript_helper_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
class JavaScriptHelperTest < ActionView::TestCase class JavaScriptHelperTest < ActionView::TestCase
tests ActionView::Helpers::JavaScriptHelper tests ActionView::Helpers::JavaScriptHelper


attr_accessor :output_buffer

def test_escape_javascript def test_escape_javascript
assert_equal '', escape_javascript(nil) assert_equal '', escape_javascript(nil)
assert_equal %(This \\"thing\\" is really\\n netos\\'), escape_javascript(%(This "thing" is really\n netos')) assert_equal %(This \\"thing\\" is really\\n netos\\'), escape_javascript(%(This "thing" is really\n netos'))
Expand Down
2 changes: 1 addition & 1 deletion actionpack/test/template/prototype_helper_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class Author::Nested < Author; end




class PrototypeHelperBaseTest < ActionView::TestCase class PrototypeHelperBaseTest < ActionView::TestCase
attr_accessor :template_format attr_accessor :template_format, :output_buffer


def setup def setup
@template = nil @template = nil
Expand Down

0 comments on commit aca246a

Please sign in to comment.