diff options
Diffstat (limited to 'actionpack/lib/action_view/renderer')
3 files changed, 38 insertions, 3 deletions
diff --git a/actionpack/lib/action_view/renderer/fibered_template_renderer.rb b/actionpack/lib/action_view/renderer/fibered_template_renderer.rb new file mode 100644 index 0000000000..45f48cab76 --- /dev/null +++ b/actionpack/lib/action_view/renderer/fibered_template_renderer.rb @@ -0,0 +1,35 @@ +require 'action_view/renderer/template_renderer' +require 'fiber' + +module ActionView + class FiberedTemplateRenderer < TemplateRenderer #:nodoc: + # Renders the given template. An string representing the layout can be + # supplied as well. + def render_template(template, layout_name = nil, locals = {}) #:nodoc: + view, locals = @view, locals || {} + + final = nil + layout = layout_name && find_layout(layout_name, locals.keys) + yielder = lambda { |*name| view._layout_for(*name) } + + instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do + @fiber = Fiber.new do + final = if layout + layout.render(view, locals, &yielder) + else + view._layout_for + end + end + + @view._view_flow = FiberedFlow.new(view._view_flow, @fiber) + @fiber.resume + + content = template.render(view, locals, &yielder) + view._view_flow.set(:layout, content) + @fiber.resume while @fiber.alive? + end + + final + end + end +end diff --git a/actionpack/lib/action_view/renderer/partial_renderer.rb b/actionpack/lib/action_view/renderer/partial_renderer.rb index 94c0a8a8fb..180afc27ac 100644 --- a/actionpack/lib/action_view/renderer/partial_renderer.rb +++ b/actionpack/lib/action_view/renderer/partial_renderer.rb @@ -79,7 +79,7 @@ module ActionView locals[as] = object content = @template.render(view, locals) do |*name| - view._layout_for(*name, &block) + view._block_layout_for(*name, &block) end content = layout.render(view, locals){ content } if layout diff --git a/actionpack/lib/action_view/renderer/template_renderer.rb b/actionpack/lib/action_view/renderer/template_renderer.rb index 439a661dd3..10d8cc3b87 100644 --- a/actionpack/lib/action_view/renderer/template_renderer.rb +++ b/actionpack/lib/action_view/renderer/template_renderer.rb @@ -7,6 +7,7 @@ module ActionView def render(options) wrap_formats(options[:template] || options[:file]) do template = determine_template(options) + freeze_formats(template.formats, true) render_template(template, options[:layout], options[:locals]) end end @@ -31,7 +32,6 @@ module ActionView # Renders the given template. An string representing the layout can be # supplied as well. def render_template(template, layout_name = nil, locals = {}) #:nodoc: - freeze_formats(template.formats, true) view, locals = @view, locals || {} render_with_layout(layout_name, locals) do |layout| @@ -47,7 +47,7 @@ module ActionView if layout view = @view - view.store_content_for(:layout, content) + view._view_flow.set(:layout, content) layout.render(view, locals){ |*name| view._layout_for(*name) } else content |