class TagBuilder

Ruby on Rails edge

Since edge

Action View Tag Builder

Returns an HTML tag.

Builds HTML5 compliant tags with a tag proxy. Every tag can be built with:

tag.<tag name>(optional content, options)

where tag name can be e.g. br, div, section, article, or any tag really. To render an HTML custom element, replace the - in the tag’s name with _. For example:

tag.turbo_frame id: "a-turbo-frame"

# => <turbo-frame id="a-turbo-frame"></turbo-frame>
Passing content

Tags can pass content to embed within it:

tag.h1 'All titles fit to print' # => <h1>All titles fit to print</h1>

tag.div tag.p('Hello world!')  # => <div><p>Hello world!</p></div>

Content can also be captured with a block, which is useful in templates:

<%= tag.p do %>
  The next great American novel starts here.
<% end %>
# => <p>The next great American novel starts here.</p>
Options

Use symbol keyed options to add attributes to the generated tag.

tag.section class: %w( kitties puppies )
# => <section class="kitties puppies"></section>

tag.section id: dom_id(@post)
# => <section id="<generated dom id>"></section>

Pass true for any attributes that can render with no values, like disabled and readonly.

tag.input type: 'text', disabled: true
# => <input type="text" disabled="disabled">

HTML5 data-* and aria-* attributes can be set with a single data or aria key pointing to a hash of sub-attributes.

To play nicely with JavaScript conventions, sub-attributes are dasherized.

tag.article data: { user_id: 123 }
# => <article data-user-id="123"></article>

Thus data-user-id can be accessed as dataset.userId.

Data attribute values are encoded to JSON, with the exception of strings, symbols, and BigDecimals. This may come in handy when using jQuery’s HTML5-aware .data() from 1.4.3.

tag.div data: { city_state: %w( Chicago IL ) }
# => <div data-city-state="[&quot;Chicago&quot;,&quot;IL&quot;]"></div>

In addition to :data and :aria, nest sub-attribute hashes for any keys:

tag.button "POST to /clicked", hx: { post: "/clicked", swap: :outerHTML }

# => <button hx-post="/clicked" hx-swap="outerHTML">POST to /clicked</button>

The generated tag names and attributes are escaped by default. This can be disabled using escape.

tag.img src: 'open & shut.png'
# => <img src="open &amp; shut.png">

tag.img src: 'open & shut.png', escape: false
# => <img src="open & shut.png">

The tag builder respects HTML5 void elements if no content is passed, and omits closing tags for those elements.

# A standard element:
tag.div # => <div></div>

# A void element:
tag.br  # => <br>

Note that when using the block form options should be wrapped in parenthesis.

<%= tag.a(href: "/about", class: "font-bold") do %>
  About the author
<% end %>
# => <a href="/about" class="font-bold">About the author</a>

Building HTML attributes

Transforms a Hash into HTML attributes, ready to be interpolated into ERB. Includes or omits boolean attributes based on their truthiness. Transforms keys nested within aria: or data: objects into aria- and data- prefixed attributes:

<input <%= tag.attributes(type: :text, aria: { label: "Search" }) %>>
# => <input type="text" aria-label="Search">

<button <%= tag.attributes id: "call-to-action", disabled: false, aria: { expanded: false } %> class="primary">Get Started!</button>
# => <button id="call-to-action" aria-expanded="false" class="primary">Get Started!</button>

Inherits from

Object

Methods (defined here)

Private methods (7)

Show private methods Implementation detail — not part of the public API.

Methods (inherited)

From Object (17)
From ActiveSupport::NumericWithFormat (2)

Type at least 2 characters to search.

Use the arrow keys to navigate results, Enter to open one, Escape to close.

Keyboard shortcuts

/
Focus search
⌘K / Ctrl-K
Command palette
?
This help
Esc
Close