Class: ActionView::CollectionRenderer
Do not use. This class is for internal use only.
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
PartialRenderer,
AbstractRenderer
|
|
|
Instance Chain:
|
|
| Inherits: |
ActionView::PartialRenderer
|
| Defined in: | actionview/lib/action_view/renderer/collection_renderer.rb |
Constant Summary
Class Attribute Summary
PartialRenderer - Inherited
| .collection_cache | Fallback cache store if Action View is used without |
Class Method Summary
Instance Attribute Summary
Instance Method Summary
- #render_collection_derive_partial(collection, context, block)
- #render_collection_with_partial(collection, partial, context, block)
- #collection_into_buffer(view, template, collection, spacer, &block) private
- #collection_with_template(view, template, layout, collection, &block) private
- #render_collection(collection, view, path, template, layout, block) private
- #retrieve_variable(path) private
PartialRenderer - Inherited
CollectionCaching - Included
| #cache_collection_render, #collection_by_cache_keys, #expanded_cache_key, | |
| #fetch_or_cache_partial |
|
| #will_cache? | |
AbstractRenderer - Inherited
Constructor Details
This class inherits a constructor from ActionView::PartialRenderer
Instance Method Details
#collection_into_buffer(view, template, collection, spacer, &block) (private)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 191
def collection_into_buffer(view, template, collection, spacer, &block) locals = @locals cache = {} spacer_body = spacer.body partial_iteration = PartialIteration.new(collection.size) buffer = nil first_template = nil collection.each_with_info do |object, (path, as, counter, iteration)| index = partial_iteration.index locals[as] = object locals[counter] = index locals[iteration] = partial_iteration _template = (cache[path] ||= (template || find_template(path, @locals.keys + [as, counter, iteration]))) if buffer buffer.safe_concat(spacer_body) unless spacer_body.empty? else buffer = OutputBuffer.new first_template = _template end _template.render(view, locals, buffer, implicit_locals: [counter, iteration], &block) partial_iteration.iterate! end if buffer build_rendered_template(buffer.to_s, first_template) else RenderedCollection.empty(@lookup_context.formats.first) end end
#collection_with_template(view, template, layout, collection, &block) (private)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 227
def collection_with_template(view, template, layout, collection, &block) locals = @locals cache = {} partial_iteration = PartialIteration.new(collection.size) collection.each_with_info.map do |object, (path, as, counter, iteration)| index = partial_iteration.index locals[as] = object locals[counter] = index locals[iteration] = partial_iteration _template = (cache[path] ||= (template || find_template(path, @locals.keys + [as, counter, iteration]))) content = _template.render(view, locals, implicit_locals: [counter, iteration], &block) content = layout.render(view, locals) { content } if layout partial_iteration.iterate! build_rendered_template(content, _template) end end
#render_collection(collection, view, path, template, layout, block) (private)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 154
def render_collection(collection, view, path, template, layout, block) identifier = (template && template.identifier) || path ActiveSupport::Notifications.instrument( "render_collection.action_view", identifier: identifier, layout: layout && layout.virtual_path, count: collection.length ) do |payload| spacer = if @options.key?(:spacer_template) spacer_template = find_template(@options[:spacer_template], @locals.keys) build_rendered_template(spacer_template.render(view, @locals), spacer_template) else RenderedTemplate::EMPTY_SPACER end # Caching and per-item layouts need each item's body on its own. # Otherwise every item is rendered into one shared buffer, which # saves a buffer and a RenderedTemplate per item that would only # be joined back together. if layout.nil? && !(template && will_cache?(@options, view)) return collection_into_buffer(view, template, collection, spacer, &block) end collection_body = if template cache_collection_render(payload, view, template, collection) do |filtered_collection| collection_with_template(view, template, layout, filtered_collection, &block) end else collection_with_template(view, nil, layout, collection, &block) end return RenderedCollection.empty(@lookup_context.formats.first) if collection_body.empty? build_rendered_collection(collection_body, spacer) end end
#render_collection_derive_partial(collection, context, block)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 131
def render_collection_derive_partial(collection, context, block) paths = collection.map { |o| partial_path(o, context) } if paths.uniq.length == 1 # Homogeneous render_collection_with_partial(collection, paths.first, context, block) else if @options[:cached] raise NotImplementedError, "render caching requires a template. Please specify a partial when rendering" end paths.map! { |path| retrieve_variable(path).unshift(path) } collection = MixedCollectionIterator.new(collection, paths) render_collection(collection, context, nil, nil, nil, block) end end
#render_collection_with_partial(collection, partial, context, block)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 113
def render_collection_with_partial(collection, partial, context, block) iter_vars = retrieve_variable(partial) collection = if collection.respond_to?(:preload_associations) PreloadCollectionIterator.new(collection, partial, iter_vars, collection) else SameCollectionIterator.new(collection, partial, iter_vars) end template = find_template(partial, @locals.keys + iter_vars) layout = if !block && (layout = @options[:layout]) find_template(layout.to_s, @locals.keys + iter_vars) end render_collection(collection, context, partial, template, layout, block) end
#retrieve_variable(path) (private)
[ GitHub ]# File 'actionview/lib/action_view/renderer/collection_renderer.rb', line 149
def retrieve_variable(path) variable = local_variable(path) [variable, :"#{variable}_counter", :"#{variable}_iteration"] end