From 233c7f76c9a2dafd9f0010b98ee20b9a7a98e8f6 Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Tue, 26 Apr 2022 12:40:31 +0200 Subject: [PATCH] Allow render_elements to take a block In this block you can call ``` render_element(element, options, i) ``` It's quite convenient! --- app/helpers/alchemy/elements_helper.rb | 13 +++++++------ spec/helpers/alchemy/elements_helper_spec.rb | 12 ++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/helpers/alchemy/elements_helper.rb b/app/helpers/alchemy/elements_helper.rb index 275a8418c1..d3e42ffc4c 100644 --- a/app/helpers/alchemy/elements_helper.rb +++ b/app/helpers/alchemy/elements_helper.rb @@ -70,7 +70,7 @@ module ElementsHelper # A class instance that will return elements that get rendered. # Use this for your custom element loading logic in views. # - def render_elements(options = {}) + def render_elements(options = {}, &blk) options = { from_page: @page, render_format: "html", @@ -86,11 +86,12 @@ def render_elements(options = {}) elements = finder.elements(page_version: page_version) - buff = [] - elements.each_with_index do |element, i| - buff << render_element(element, options, i + 1) - end - buff.join(options[:separator]).html_safe + default_rendering = ->(element, i) { render_element(element, options, i + 1) } + if block_given? + elements.map.with_index(&blk) + else + elements.map.with_index(&default_rendering) + end.join(options[:separator]).html_safe end # This helper renders a {Alchemy::Element} view partial. diff --git a/spec/helpers/alchemy/elements_helper_spec.rb b/spec/helpers/alchemy/elements_helper_spec.rb index 6d333ace3b..9c737aae33 100644 --- a/spec/helpers/alchemy/elements_helper_spec.rb +++ b/spec/helpers/alchemy/elements_helper_spec.rb @@ -92,6 +92,18 @@ module Alchemy end end + context "with a block" do + subject do + helper.render_elements(separator: ", ") do |element| + element.name + end + end + + it "renders the block" do + is_expected.to eq("headline, article") + end + end + context "with from_page option" do context "is a page object" do let(:another_page) { create(:alchemy_page, :public) }