diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb index 00b12ad3a9a5893e707994fb9a8f34ff86f0c03a..04edb9ab44fc35cb2a5a6ede74f3068b5e312872 100644 --- a/actionpack/lib/action_view/render/partials.rb +++ b/actionpack/lib/action_view/render/partials.rb @@ -205,11 +205,22 @@ def setup(options, block) end def render + options = @options + if @collection = collection - render_collection + ActiveSupport::Notifications.instrument(:render_collection, :path => @path, + :count => @collection.size) do + render_collection + end else - @template = template = find_template - render_template(template, @object || @locals[template.variable_name]) + content = ActiveSupport::Notifications.instrument(:render_partial, :path => @path) do + render_partial + end + + if !@block && options[:layout] + content = @view._render_layout(find_template(options[:layout]), @locals){ content } + end + content end end @@ -227,9 +238,7 @@ def render_collection end def collection_with_template(template) - options = @options - - segments, locals, as = [], @locals, options[:as] || template.variable_name + segments, locals, as = [], @locals, @options[:as] || template.variable_name counter_name = template.counter_name locals[counter_name] = -1 @@ -246,9 +255,7 @@ def collection_with_template(template) end def collection_without_template - options = @options - - segments, locals, as = [], @locals, options[:as] + segments, locals, as = [], @locals, @options[:as] index, template = -1, nil @collection.each do |object| @@ -263,18 +270,15 @@ def collection_without_template segments end - def render_template(template, object = @object) - options, locals, view = @options, @locals, @view - locals[options[:as] || template.variable_name] = object + def render_partial(object = @object) + @template = template = find_template + locals, view = @locals, @view - content = template.render(view, locals) do |*name| - @view._layout_for(*name, &@block) - end + object ||= locals[template.variable_name] + locals[@options[:as] || template.variable_name] = object - if @block || !options[:layout] - content - else - @view._render_layout(find_template(options[:layout]), @locals){ content } + template.render(view, locals) do |*name| + view._layout_for(*name, &@block) end end diff --git a/actionpack/lib/action_view/render/rendering.rb b/actionpack/lib/action_view/render/rendering.rb index c4033fad9eac1c2f1e2e61ded4212606e0475f21..5e7dd3e2df46d6c23cfc25fabb5ccb57ab0eb3f2 100644 --- a/actionpack/lib/action_view/render/rendering.rb +++ b/actionpack/lib/action_view/render/rendering.rb @@ -77,16 +77,19 @@ def _layout_for(name = nil, &block) end def _render_inline(inline, layout, options) - handler = Template.handler_class_for_extension(options[:type] || "erb") - template = Template.new(options[:inline], "inline template", handler, {}) + locals = options[:locals] - locals = options[:locals] - content = template.render(self, locals) + content = ActiveSupport::Notifications.instrument(:render_inline) do + handler = Template.handler_class_for_extension(options[:type] || "erb") + template = Template.new(options[:inline], "inline template", handler, {}) + template.render(self, locals) + end _render_text(content, layout, locals) end def _render_text(content, layout, locals) + ActiveSupport::Notifications.instrument(:render_text) content = _render_layout(layout, locals){ content } if layout content end @@ -110,8 +113,13 @@ def _render_template(template, layout = nil, options = {}, partial = nil) msg end - locals = options[:locals] || {} - content = partial ? _render_partial_object(template, options) : template.render(self, locals) + locals = options[:locals] || {} + + content = ActiveSupport::Notifications.instrument(:render_template, + :identifier => template.identifier, :layout => (layout ? layout.identifier : nil)) do + partial ? _render_partial_object(template, options) : template.render(self, locals) + end + @_content_for[:layout] = content if layout @@ -124,7 +132,9 @@ def _render_template(template, layout = nil, options = {}, partial = nil) end def _render_layout(layout, locals, &block) - layout.render(self, locals){ |*name| _layout_for(*name, &block) } + ActiveSupport::Notifications.instrument(:render_layout, :identifier => layout.identifier) do + layout.render(self, locals){ |*name| _layout_for(*name, &block) } + end end end end diff --git a/actionpack/lib/action_view/template.rb b/actionpack/lib/action_view/template.rb index d46c989d1164893c47ff6328b2ee82586abd2109..adaf6544a7b2804b24f73d80ca24021e4f532ff4 100644 --- a/actionpack/lib/action_view/template.rb +++ b/actionpack/lib/action_view/template.rb @@ -36,10 +36,8 @@ def initialize(source, identifier, handler, details) end def render(view, locals, &block) - ActiveSupport::Notifications.instrument(:render_template, :identifier => identifier) do - method_name = compile(locals, view) - view.send(method_name, locals, &block) - end + method_name = compile(locals, view) + view.send(method_name, locals, &block) rescue Exception => e if e.is_a?(Template::Error) e.sub_template_of(self)