Written by Sean Behan on Sun Jun 17th 2012

Extending forms in Rails is simple and will greatly reduce the amount of code in your views. This example is taken right from the Agile Web Development book on Rails(2.1.*) with one minor tweak. I want to pass a label argument along with the field name so that I can display a more human friendly string to represent the form field.

# RAILS_ROOT/app/helpers/custom_tag_builder.rb
class CustomTagBuilder < ActionView::Helpers::FormBuilder

def self.create_tagged_field(method_name) define_method(method_name) do |label, *args| label_name = args.first.blank? ? label : args.first[:label] # my change @template.content_tag("p", @template.content_tag("label", label_name.to_s.humanize, :for => "#{@objectname}#{label}") +"
"+ super) end end

field_helpers.each do |name| create_tagged_field(name) end end

You can then use this in your views

form_for @your_model, :builder => CustomTagBuilder do |f|
  f.text_field :fullname
  f.text_field :email, :label => "Email (will not be published)"
My change tests for the presence of a label argument otherwise using the name of the form field/model attribute. In this case the fullname attribute will be outputted as "Fullname" while "Email (will not be published)" as the label for the email text field.

Tagged with..
#builders #custom tag builder #extending #forms #label #Rails #template #text field #Ruby on Rails

Just finishing up brewing up some fresh ground comments...