aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view/renderer')
-rw-r--r--actionpack/lib/action_view/renderer/fibered_template_renderer.rb35
-rw-r--r--actionpack/lib/action_view/renderer/partial_renderer.rb2
-rw-r--r--actionpack/lib/action_view/renderer/template_renderer.rb4
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