123456789_123456789_123456789_123456789_123456789_

Class: ActionView::Renderer

Relationships & Source Files
Inherits: Object
Defined in: actionview/lib/action_view/renderer/renderer.rb

Overview

This is the main entry point for rendering. It basically delegates to other objects like TemplateRenderer and PartialRenderer which actually renders the template.

The Renderer will parse the options from the #render or #render_body method and render a partial or a template based on the options. The TemplateRenderer and PartialRenderer objects are wrappers which do all the setup and logic necessary to render a view and a new object is created each time #render is called.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(lookup_context) ⇒ Renderer

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 18

def initialize(lookup_context)
  @lookup_context = lookup_context
end

Instance Attribute Details

#lookup_context (rw)

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 16

attr_accessor :lookup_context

Instance Method Details

#cache_hits

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 58

def cache_hits # :nodoc:
  @cache_hits ||= {}
end

#collection_from_object(object) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 109

def collection_from_object(object)
  object if object.respond_to?(:to_ary)
end

#collection_from_options(options) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 102

def collection_from_options(options)
  if options.key?(:collection)
    collection = options[:collection]
    collection || []
  end
end

#render(context, options)

Main render entry point shared by Action View and Action Controller.

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 23

def render(context, options)
  render_to_object(context, options).body
end

#render_body(context, options)

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.

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 40

def render_body(context, options)
  if options.key?(:partial)
    [render_partial(context, options)]
  else
    StreamingTemplateRenderer.new(@lookup_context).render(context, options)
  end
end

#render_partial(context, options, &block)

This method is for internal use only.

Direct access to partial rendering.

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 54

def render_partial(context, options, &block) # :nodoc:
  render_partial_to_object(context, options, &block).body
end

#render_partial_to_object(context, options, &block)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 66

def render_partial_to_object(context, options, &block) # :nodoc:
  partial = options[:partial]
  if String === partial
    collection = collection_from_options(options)

    if collection
      # Collection + Partial
      renderer = CollectionRenderer.new(@lookup_context, options)
      renderer.render_collection_with_partial(collection, partial, context, block)
    else
      if options.key?(:object)
        # Object + Partial
        renderer = ObjectRenderer.new(@lookup_context, options)
        renderer.render_object_with_partial(options[:object], partial, context, block)
      else
        # Partial
        renderer = PartialRenderer.new(@lookup_context, options)
        renderer.render(partial, context, block)
      end
    end
  else
    collection = collection_from_object(partial) || collection_from_options(options)

    if collection
      # Collection + Derived Partial
      renderer = CollectionRenderer.new(@lookup_context, options)
      renderer.render_collection_derive_partial(collection, context, block)
    else
      # Object + Derived Partial
      renderer = ObjectRenderer.new(@lookup_context, options)
      renderer.render_object_derive_partial(partial, context, block)
    end
  end
end

#render_template(context, options)

This method is for internal use only.

Direct access to template rendering.

[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 49

def render_template(context, options) # :nodoc:
  render_template_to_object(context, options).body
end

#render_template_to_object(context, options)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 62

def render_template_to_object(context, options) # :nodoc:
  TemplateRenderer.new(@lookup_context).render(context, options)
end

#render_to_object(context, options)

This method is for internal use only.
[ GitHub ]

  
# File 'actionview/lib/action_view/renderer/renderer.rb', line 27

def render_to_object(context, options) # :nodoc:
  if options.key?(:partial)
    render_partial_to_object(context, options)
  else
    render_template_to_object(context, options)
  end
end