Skip to main content

custom-form-builder

📝 Tip: Create a Custom Form Builder for Consistent Markup

Subclass ActionView::Helpers::FormBuilder to wrap common patterns (e.g., error display, wrappers) and register it via form_with. This enforces a uniform input structure.

Example:

# app/forms/bootstrap_form_builder.rb
class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
def text_field(method, options = {})
@template.content_tag(:div, class: 'form-group') do
super + error_message(method)
end
end

private

def error_message(method)
return '' unless object.errors[method].any?
@template.content_tag(:span, object.errors[method].join(', '), class: 'text-danger')
end
end
<%= form_with(model: @user, builder: BootstrapFormBuilder) do |f| %>
<%= f.text_field :email %>
<%= f.submit %>
<% end %>