mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Fixed bc5896e, and added test case for the caching bug it originally introduced.
This commit is contained in:
@@ -332,6 +332,9 @@ module ActionView #:nodoc:
|
||||
end
|
||||
end
|
||||
|
||||
extend ActiveSupport::Memoizable
|
||||
memoize :pick_template
|
||||
|
||||
private
|
||||
# Renders the template present at <tt>template_path</tt>. The hash in <tt>local_assigns</tt>
|
||||
# is made available as local variables.
|
||||
|
||||
@@ -102,6 +102,8 @@ module ActionView
|
||||
#
|
||||
# As you can see, the <tt>:locals</tt> hash is shared between both the partial and its layout.
|
||||
module Partials
|
||||
extend ActiveSupport::Memoizable
|
||||
|
||||
private
|
||||
def render_partial(partial_path, object_assigns = nil, local_assigns = {}) #:nodoc:
|
||||
local_assigns ||= {}
|
||||
@@ -129,14 +131,12 @@ module ActionView
|
||||
|
||||
local_assigns = local_assigns ? local_assigns.clone : {}
|
||||
spacer = partial_spacer_template ? render(:partial => partial_spacer_template) : ''
|
||||
_paths = {}
|
||||
_templates = {}
|
||||
|
||||
index = 0
|
||||
collection.map do |object|
|
||||
_partial_path ||= partial_path || ActionController::RecordIdentifier.partial_path(object, controller.class.controller_path)
|
||||
path = _paths[_partial_path] ||= find_partial_path(_partial_path)
|
||||
template = _templates[path] ||= pick_template(path)
|
||||
path = find_partial_path(_partial_path)
|
||||
template = pick_template(path)
|
||||
local_assigns[template.counter_name] = index
|
||||
result = template.render_partial(self, object, local_assigns, as)
|
||||
index += 1
|
||||
@@ -153,5 +153,6 @@ module ActionView
|
||||
"_#{partial_path}"
|
||||
end
|
||||
end
|
||||
memoize :find_partial_path
|
||||
end
|
||||
end
|
||||
|
||||
@@ -84,7 +84,7 @@ module ActionView
|
||||
# The template will be compiled if the file has not been compiled yet, or
|
||||
# if local_assigns has a new key, which isn't supported by the compiled code yet.
|
||||
def recompile?(symbol)
|
||||
!(frozen? && Base::CompiledTemplates.method_defined?(symbol))
|
||||
!(ActionView::PathSet::Path.eager_load_templates? && Base::CompiledTemplates.method_defined?(symbol))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,9 +30,12 @@ uses_mocha 'TestTemplateRecompilation' do
|
||||
assert_equal "Hello world!", render("test/hello_world.erb")
|
||||
end
|
||||
|
||||
def test_compiled_template_will_be_recompiled_when_rendered_if_template_is_outside_cache
|
||||
def test_compiled_template_will_always_be_recompiled_when_eager_loaded_templates_is_off
|
||||
ActionView::PathSet::Path.expects(:eager_load_templates?).times(4).returns(false)
|
||||
assert_equal 0, @compiled_templates.instance_methods.size
|
||||
assert_equal "Hello world!", render("#{FIXTURE_LOAD_PATH}/test/hello_world.erb")
|
||||
ActionView::Template.any_instance.expects(:compile!).times(3)
|
||||
3.times { assert_equal "Hello world!", render("#{FIXTURE_LOAD_PATH}/test/hello_world.erb") }
|
||||
assert_equal 1, @compiled_templates.instance_methods.size
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user