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