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 => "#{@object_name}_#{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.