aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/renderable.rb
diff options
context:
space:
mode:
authorAndrew White <andyw@pixeltrix.co.uk>2009-02-10 12:09:49 -0600
committerJoshua Peek <josh@joshpeek.com>2009-02-10 12:09:49 -0600
commit199e750d46c04970b5e7684998d09405648ecbd4 (patch)
tree97f847ba98946ac2da003831042966afb1017268 /actionpack/lib/action_view/renderable.rb
parent1dab1d380377f1a2a60da43bc22989d55632d246 (diff)
downloadrails-199e750d46c04970b5e7684998d09405648ecbd4.tar.gz
rails-199e750d46c04970b5e7684998d09405648ecbd4.tar.bz2
rails-199e750d46c04970b5e7684998d09405648ecbd4.zip
Fix some edge cases when the same template is called with different local assigns
Signed-off-by: Joshua Peek <josh@joshpeek.com>
Diffstat (limited to 'actionpack/lib/action_view/renderable.rb')
-rw-r--r--actionpack/lib/action_view/renderable.rb30
1 files changed, 29 insertions, 1 deletions
diff --git a/actionpack/lib/action_view/renderable.rb b/actionpack/lib/action_view/renderable.rb
index c127bb25d6..16cdd0162e 100644
--- a/actionpack/lib/action_view/renderable.rb
+++ b/actionpack/lib/action_view/renderable.rb
@@ -16,8 +16,18 @@ module ActionView
memoize :handler
def compiled_source
+ @compiled_at = Time.now
handler.call(self)
end
+ memoize :compiled_source
+
+ def compiled_at
+ @compiled_at
+ end
+
+ def defined_at
+ @defined_at ||= {}
+ end
def method_name_without_locals
['_run', extension, method_segment].compact.join('_')
@@ -61,8 +71,12 @@ module ActionView
def compile(local_assigns)
render_symbol = method_name(local_assigns)
- if !Base::CompiledTemplates.method_defined?(render_symbol) || recompile?
+ if self.is_a?(InlineTemplate)
compile!(render_symbol, local_assigns)
+ else
+ if !Base::CompiledTemplates.method_defined?(render_symbol) || recompile?(render_symbol)
+ recompile!(render_symbol, local_assigns)
+ end
end
end
@@ -79,6 +93,7 @@ module ActionView
begin
ActionView::Base::CompiledTemplates.module_eval(source, filename, 0)
+ defined_at[render_symbol] = Time.now if respond_to?(:reloadable?) && reloadable?
rescue Errno::ENOENT => e
raise e # Missing template file, re-raise for Base to rescue
rescue Exception => e # errors from template code
@@ -91,5 +106,18 @@ module ActionView
raise ActionView::TemplateError.new(self, {}, e)
end
end
+
+ def recompile?(render_symbol)
+ !cached? || redefine?(render_symbol) || stale?
+ end
+
+ def recompile!(render_symbol, local_assigns)
+ compiled_source(:reload) if compiled_at.nil? || compiled_at < mtime
+ compile!(render_symbol, local_assigns)
+ end
+
+ def redefine?(render_symbol)
+ compiled_at && defined_at[render_symbol] && compiled_at > defined_at[render_symbol]
+ end
end
end