Hi everyone!
I’m using the advice in ‘Agile Web D. With Rails’ and creating
a FormBuilder sub-class to handle the formatting of elements in my
standard forms. Hence, I have the following view:
[code]<%= error_messages_for :enquiry -%>
<% tagged_form_for :enquiry,
:url => { :action => “submit” } do |form| %>
<dl class="form">
<%= form.text_field :name %>
<%= form.text_field :email %>
<dl class="form">
<%= form.text_field :telephone %>
<%= form.text_area :message %>
<ul class="form">
</li>
<%= submit_tag ‘Send Message’ %>
<% end %>[/code]
Which uses the following code in application_helper.rb:
[code]# Methods added to this helper will be available to all templates
in the application.
module ApplicationHelper
def tagged_form_for(name, *args, &block)
options = args.last.is_a?(Hash) ? args.pop : {}
options = options.merge(:builder => TaggedFormBuilder)
args = (args << options)
form_for(name, *args, &block)
end
private
class TaggedFormBuilder < ActionView::Helpers::FormBuilder
# <dt><label for="name">Your N.</label> <em>(required)</em>:</dd>
# <dd><%= form.text_field :name %></dd>
def self.create_tagged_field(method_name)
define_method(method_name) do |label, *args|
@template.content_tag("dt",
@template.content_tag("label",
label.to_s.humanize,
:for =>
“#{@object_name}_#{label}”)) +
@template.content_tag(“dd”,
super)
end
end
field_helpers.each do |name|
create_tagged_field(name)
end
end
end[/code]
And that results in the following HTML:
[code]
- Name
- Telephone
- Message
Which can be seen in the attached screenshot.
So, all very nice so far. However, I think it can be made better, for
instance, the form is clearly split into sections so it would be nice to
have the view say something like:
[code]<% tagged_form_for :enquiry,
:url => { :action => “submit” } do |form| %>
<% form.section do |section| %>
<%= section.text_field :name %>
<%= section.text_field :email %>
<% end %>
<% form.section do |section| %>
<%= section.text_field :telephone %>
<%= section.text_field :message %>
<% end %>
…
<% end %>[/code]
But I can’t figure out how to do this It would also be nice to have a
specific command to generate the submit section of the form:
[code]<% tagged_form_for :enquiry,
:url => { :action => “submit” } do |form| %>
…
<% form.submit_section %>
<% end %>[/code]
But again, this is beyond my feeble grasp of RoR. Finally, I need to add
a :required => true|false parameter to the options for each field, which
will flag the field in the HTML output as follows:
[code]
I think this change should (probably) be the easiest of the lot, but it
is still beyond my abilities.
Anyway, help with ANY of these issues would be appreciated.
Thanks
Jay