‘Iacta alea est’
If we turn our attention to Formtastic then we can create a form using our model object from default Rails.
Formtastic is a layer of syntactic sugar upon Rails default form builder.
<%= semantic_form_for @form,
as: :subscription,
url: email_subscriptions_path do |f| %>
<%= f.input :email,
label: "Email address",
hint: "We'll never share your email with anyone else." %>
<%= f.action :submit,
as: :button,
label: "Submit" %>
<% end %>
I think this is enough to get us what we want. There is one distinction worth noting: Formtastic defaults to an li
as a wrapper for the form-control. That’s not such a big deal, and more semantically correct if we’re being pedantic.
I think there are a few things that are interesting here. Given our categories and the hierarchy then Formtastic really does seem to capture the definition of a field at the right level.
The attribute, label and hint are all specified at the top level, being the key concerns in the template. Formtastic automatically chooses input[type=email]
based on the attribute name containing the string "email"
, so the mapping is implicit.
The errors are invisible being an internal concern. The input is the central element that is then wrapped by the hint/help text and, optionally, the error message.
Here we see that explicitly in the code:
# Formtastic::Inputs::Base::Wrapping
def input_wrapping(&block)
template.content_tag(:li,
[template.capture(&block), error_html, hint_html].join("\n").html_safe,
wrapper_html_options
)
end
Where the input is itself wrapping the original Rails method:
# Formtastic::Inputs::EmailInput
def to_html
input_wrapping do
label_html <<
builder.email_field(method, input_html_options)
end
end
The label lives together with the field.
If we flatten that out then we see all four aspects:
label_html
email_field
error_html
hint_html
I think I like this succinctness but part of me would prefer this mapping to live outside of the template itself.
—Thursday 24th June 2021.