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