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::FormBuilderdef 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 endfield_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.
Just finishing up brewing up some fresh ground comments...