class ViewComponent::Collection

Attributes

component[R]

Public Class Methods

new(component, object, **options) click to toggle source
# File lib/view_component/collection.rb, line 25
def initialize(component, object, **options)
  @component = component
  @collection = collection_variable(object || [])
  @options = options
end

Public Instance Methods

render_in(view_context, &block) click to toggle source
# File lib/view_component/collection.rb, line 11
def render_in(view_context, &block)
  iterator = ActionView::PartialIteration.new(@collection.size)

  component.validate_collection_parameter!(validate_default: true)

  @collection.map do |item|
    content = component.new(**component_options(item, iterator)).render_in(view_context, &block)
    iterator.iterate!
    content
  end.join.html_safe # rubocop:disable Rails/OutputSafety
end

Private Instance Methods

collection_variable(object) click to toggle source
# File lib/view_component/collection.rb, line 31
def collection_variable(object)
  if object.respond_to?(:to_ary)
    object.to_ary
  else
    raise ArgumentError.new(
      "The value of the first argument passed to `with_collection` isn't a valid collection. " \
      "Make sure it responds to `to_ary`."
    )
  end
end
component_options(item, iterator) click to toggle source
# File lib/view_component/collection.rb, line 42
def component_options(item, iterator)
  item_options = { component.collection_parameter => item }
  item_options[component.collection_counter_parameter] = iterator.index + 1 if component.counter_argument_present?
  item_options[component.collection_iteration_parameter] = iterator if component.iteration_argument_present?

  @options.merge(item_options)
end