lib/express_templates/components/capabilities/iteration.rb in express_templates-0.11.18 vs lib/express_templates/components/capabilities/iteration.rb in express_templates-0.11.19

- old
+ new

@@ -7,22 +7,23 @@ module Iteration def self.included(base) base.class_eval do + has_option :collection, "An optional object implementing Enumerable or a proc returning an Enumerable.", type: [:proc, :array] + # Iterates over the collection calling the block provided to emit markup. # # The collection (symbol) must be available as a method on the component # or as a local (assigns) value in the rendering context. # # The collection name is singularized and a local value is set # for each item in the collection. def for_all(collection_name, &block) @collection_name = collection_name - raise "#{collection_name} is not a collection" unless self.send(collection_name).respond_to?(:each) - self.send(collection_name).each do |item| + _normalized_collection.each do |item| old_value = assigns[singular_item_name] assigns[singular_item_name] = item block.call assigns[singular_item_name] = old_value end @@ -38,9 +39,22 @@ collection_name.to_s.singularize.to_sym end def item assigns[singular_item_name] + end + + private + def _normalized_collection + case + when config[:collection].respond_to?(:call) + config[:collection].call() + when config[:collection].respond_to?(:each) + config[:collection] + else + raise "#{collection_name} is not a collection" unless self.send(collection_name).respond_to?(:each) + self.send(collection_name) + end end end end end \ No newline at end of file