Module: Alchemy::ElementsBlockHelper

Included in:
ElementsHelper
Defined in:
app/helpers/alchemy/elements_block_helper.rb

Overview

Provides a collection of block-level helpers, allowing for a much more concise way of writing element view/editor partials.

Defined Under Namespace

Classes: BlockHelper, ElementViewHelper

Instance Method Summary collapse

Instance Method Details

#element_view_for(element, options = {}) ⇒ Object

Block-level helper for element views. Constructs a DOM element wrapping your content element and provides a block helper object you can use for concise access to Alchemy's various helpers.

Example:

<%= element_view_for(element) do |el| %>
  <%= el.render :title %>
  <%= el.render :body %>
  <%= link_to "Go!", el.ingredient(:target_url) %>
<% end %>

You can override the tag, ID and class used for the generated DOM element:

<%= element_view_for(element, tag: 'span', id: 'my_id', class: 'thing') do |el| %>
   <%- ... %>
<% end %>

If you don't want your view to be wrapped into an extra element, simply set `tag` to `false`:

<%= element_view_for(element, tag: false) do |el| %>
   <%- ... %>
<% end %>

Parameters:

  • element (Alchemy::Element)

    The element to display.

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

    Additional options.

Options Hash (options):

  • :tag (Object) — default: :div

    The HTML tag to be used for the wrapping element.

  • :id (Object) — default: the element's dom_id

    The wrapper tag's DOM ID.

  • :class (Object) — default: the element's essence name

    The wrapper tag's DOM class.

  • :tags_formatter (Object)

    A lambda used for formatting the element's tags (see Alchemy::ElementsHelper::element_tags_attributes). Set to false to not include tags in the wrapper element.


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'app/helpers/alchemy/elements_block_helper.rb', line 128

def element_view_for(element, options = {})
  options = {
    tag: :div,
    id: element_dom_id(element),
    class: element.name,
    tags_formatter: ->(tags) { tags.join(" ") },
  }.merge(options)

  # capture inner template block
  output = capture do
    yield ElementViewHelper.new(self, element: element) if block_given?
  end

  # wrap output in a useful DOM element
  if tag = options.delete(:tag)
    # add preview attributes
    options.merge!(element_preview_code_attributes(element))

    # add tags
    if tags_formatter = options.delete(:tags_formatter)
      options.merge!(element_tags_attributes(element, formatter: tags_formatter))
    end

    output = (tag, output, options)
  end

  # that's it!
  output
end