Method: Alchemy::ElementsHelper#render_elements

Defined in:
app/helpers/alchemy/elements_helper.rb

#render_elements(options = {}, &blk) ⇒ Object

Renders elements from given page

Examples:

Render only certain elements:

<header>
  <%= render_elements only: ['header', 'claim'] %>
</header>
<section id="content">
  <%= render_elements except: ['header', 'claim'] %>
</section>

Render elements from global page:

<footer>
  <%= render_elements from_page: Alchemy::Page.find_by(page_layout: 'footer') %>
</footer>

Custom elements finder:

Having a custom element finder class:

class MyCustomNewsArchive
  def elements(page:)
    news_page.elements.named('news').order(created_at: :desc)
  end

  private

  def news_page
    Alchemy::Page.where(page_layout: 'news-archive')
  end
end

In your view:

<div class="news-archive">
  <%= render_elements finder: MyCustomNewsArchive.new %>
</div>

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :from_page (Alchemy::Page) — default: @page

    The page the elements are rendered from.

  • :only (Array<String>|String)

    A list of element names only to be rendered.

  • :except (Array<String>|String)

    A list of element names not to be rendered.

  • :count (Number)

    The amount of elements to be rendered (begins with first element found)

  • :offset (Number)

    The offset to begin loading elements from

  • :random (Boolean) — default: false

    Randomize the output of elements

  • :reverse (Boolean) — default: false

    Reverse the rendering order

  • :separator (String)

    A string that will be used to join the element partials.

  • :finder (Class) — default: Alchemy::ElementsFinder

    A class instance that will return elements that get rendered. Use this for your custom element loading logic in views.



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'app/helpers/alchemy/elements_helper.rb', line 73

def render_elements(options = {}, &blk)
  options = {
    from_page: Current.page || @page,
    render_format: "html"
  }.update(options)

  finder = options[:finder] || Alchemy::ElementsFinder.new(options)

  page_version = if Current.preview_page?
    options[:from_page]&.draft_version
  else
    options[:from_page]&.public_version
  end

  elements = finder.elements(page_version: page_version)

  default_rendering = ->(element, i) { render_element(element, options, i + 1) }
  capture do
    if blk
      elements.map.with_index(&blk)
    else
      elements.map.with_index(&default_rendering)
    end.join(options[:separator]).html_safe
  end
end