aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/renderer/renderer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view/renderer/renderer.rb')
-rw-r--r--actionpack/lib/action_view/renderer/renderer.rb70
1 files changed, 70 insertions, 0 deletions
diff --git a/actionpack/lib/action_view/renderer/renderer.rb b/actionpack/lib/action_view/renderer/renderer.rb
new file mode 100644
index 0000000000..f0ee103d80
--- /dev/null
+++ b/actionpack/lib/action_view/renderer/renderer.rb
@@ -0,0 +1,70 @@
+module ActionView
+ # This is the main entry point for rendering. It basically delegates
+ # to other objects like TemplateRenderer and PartialRenderer which
+ # actually renders the template.
+ class Renderer
+ attr_accessor :lookup_context
+
+ # TODO: render_context should not be an initialization parameter
+ def initialize(lookup_context, render_context)
+ @render_context = render_context
+ @lookup_context = lookup_context
+ @view_flow = OutputFlow.new
+ end
+
+ # Returns the result of a render that's dictated by the options hash. The primary options are:
+ #
+ # * <tt>:partial</tt> - See ActionView::Partials.
+ # * <tt>:file</tt> - Renders an explicit template file (this used to be the old default), add :locals to pass in those.
+ # * <tt>:inline</tt> - Renders an inline template similar to how it's done in the controller.
+ # * <tt>:text</tt> - Renders the text passed in out.
+ #
+ # If no options hash is passed or :update specified, the default is to render a partial and use the second parameter
+ # as the locals hash.
+ def render(options = {}, locals = {}, &block)
+ case options
+ when Hash
+ if block_given?
+ _render_partial(options.merge(:partial => options[:layout]), &block)
+ elsif options.key?(:partial)
+ _render_partial(options)
+ else
+ _render_template(options)
+ end
+ else
+ _render_partial(:partial => options, :locals => locals)
+ end
+ end
+
+ # Render but returns a valid Rack body. If fibers are defined, we return
+ # a streaming body that renders the template piece by piece.
+ #
+ # Note that partials are not supported to be rendered with streaming,
+ # so in such cases, we just wrap them in an array.
+ def render_body(options)
+ if options.key?(:partial)
+ [_render_partial(options)]
+ else
+ StreamingTemplateRenderer.new(@render_context, @lookup_context).render(options)
+ end
+ end
+
+ private
+
+ def _render_template(options) #:nodoc:
+ _template_renderer.render(options)
+ end
+
+ def _template_renderer #:nodoc:
+ @_template_renderer ||= TemplateRenderer.new(@render_context, @lookup_context)
+ end
+
+ def _render_partial(options, &block) #:nodoc:
+ _partial_renderer.setup(options, block).render
+ end
+
+ def _partial_renderer #:nodoc:
+ @_partial_renderer ||= PartialRenderer.new(@render_context, @lookup_context)
+ end
+ end
+end \ No newline at end of file