<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>OnRails.org: Advanced Rails Studio: Custom Form Builder</title>
    <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby On Rails and related matters.</description>
    <item>
      <title>Advanced Rails Studio: Custom Form Builder</title>
      <description>&lt;p&gt;Custom Form Builder&lt;/p&gt;


	&lt;p&gt;Use a custom form builder to clean up your html.erb files.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;div class="codetitle"&gt;lib/label_form_builder.rb&lt;/div&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;LabelFormBuilder&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActionView&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Helpers&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;FormBuilder&lt;/span&gt;
  &lt;span class="ident"&gt;helpers&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;field_helpers&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;
            &lt;span class="punct"&gt;%w{&lt;/span&gt;&lt;span class="string"&gt;date_select datetime_select time_select&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;
            &lt;span class="punct"&gt;%w{&lt;/span&gt;&lt;span class="string"&gt;collection_select select country_select time_zone_select&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;
            &lt;span class="punct"&gt;%w{&lt;/span&gt;&lt;span class="string"&gt;hidden_field label fields_for&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="comment"&gt;# Don't decorate these&lt;/span&gt;

  &lt;span class="ident"&gt;helpers&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;define_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;field&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;last&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;is_a?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Hash&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pop&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
      &lt;span class="ident"&gt;label&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;label&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;field&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:label&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="symbol"&gt;:class&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:label_clas&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
      &lt;span class="attribute"&gt;@template&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content_tag&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:p&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;label&lt;/span&gt; &lt;span class="punct"&gt;+'&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  &lt;span class="comment"&gt;#wrap with a paragraph &lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Then you can remove all the &amp;lt;p&amp;gt; and label tags from you form.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;div class="codetitle"&gt;app/views/users/edit.html.erb&lt;/div&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&amp;lt;h1&amp;gt;Editing user&amp;lt;/h1&amp;gt;

&amp;lt;% form_for(@user, :builder =&amp;gt; LabelFormBuilder) do |f| %&amp;gt;
  &amp;lt;%= f.error_messages %&amp;gt;
    &amp;lt;%= f.text_field :name %&amp;gt;
    &amp;lt;%= f.text_field :address %&amp;gt;
    &amp;lt;%= f.text_area :comment %&amp;gt;
    &amp;lt;%= f.check_box :check %&amp;gt;
    &amp;lt;%= f.submit &amp;quot;Update&amp;quot; %&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;%= link_to 'Show', @user %&amp;gt; |
&amp;lt;%= link_to 'Back', users_path %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Add this to your application initializer to have all form use this form builder&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;ActionView::Base.default_form_builder = LabelFormBuilder&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Then you can replace
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&amp;lt;% form_for(@user, :builder =&amp;gt; LabelFormBuilder) do |f| %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
with 
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&amp;lt;% form_for(@user) do |f| %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Now the same form with no custom builder was looking like this before.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&amp;lt;h1&amp;gt;Editing user&amp;lt;/h1&amp;gt;

&amp;lt;% form_for(@user) do |f| %&amp;gt;
  &amp;lt;%= f.error_messages %&amp;gt;

  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :name %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.text_field :name %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :address %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.text_field :address %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :comment %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.text_area :comment %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :check %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.check_box :check %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.submit &amp;quot;Update&amp;quot; %&amp;gt;
  &amp;lt;/p&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;%= link_to 'Show', @user %&amp;gt; |
&amp;lt;%= link_to 'Back', users_path %&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 13 Jun 2008 21:42:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:41ff6cc5-00fe-4bfe-b9bf-2c982e24f747</guid>
      <author>Daniel Wanja</author>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder</link>
      <category>Ruby On Rails</category>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Lewis Hoffman</title>
      <description>&lt;p&gt;Thanks, Daniel.  hit the spot!  :)&lt;/p&gt;</description>
      <pubDate>Wed, 07 Jan 2009 23:39:33 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:220f7659-6730-42ca-88da-2cbbb52492d1</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-4188</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Douglas</title>
      <description>&lt;p&gt;Works for me in edge rails (2.3.0).  I followed @Carlo and made a builder folder and added to environment.rb.&lt;/p&gt;</description>
      <pubDate>Mon, 01 Dec 2008 19:20:49 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:1ef3f546-3758-4ff5-a6b1-c3cd3c2bed99</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-4156</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by feh</title>
      <description>&lt;p&gt;I&amp;#8217;m getting &amp;#8220;stack level too deep&amp;#8221; errors.  Is anyone else seeing this, and have a solution to it?&lt;/p&gt;</description>
      <pubDate>Tue, 25 Nov 2008 23:55:46 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:5cf93c4f-62ba-4fc6-a6f8-8c27e6d08d16</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-4154</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by RaW</title>
      <description>&lt;p&gt;You can replace&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;options = args.last.is_a?(Hash) ? args.pop : {}&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;with predefined Rails method&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;options = args.extract_options! &lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 25 Aug 2008 11:57:09 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:3eaaa459-694a-478f-b47f-0b12d4919778</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3953</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Daniel Cadenas</title>
      <description>&lt;p&gt;I think a better place to put it is the helpers directory and you won&amp;#8217;t need to load the path.&lt;/p&gt;</description>
      <pubDate>Sun, 06 Jul 2008 19:28:02 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:5633535b-a042-4746-b86e-99a8c25999a1</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3831</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Carlo</title>
      <description>&lt;p&gt;simply put following line into your environment.rb file:&lt;/p&gt;


	&lt;p&gt;config.load_paths += %W( #{RAILS_ROOT}/app/builders )&lt;/p&gt;


	&lt;p&gt;and your builder under app/builders&lt;/p&gt;</description>
      <pubDate>Thu, 19 Jun 2008 13:31:28 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:d636d938-1d87-44ff-b719-3a603485a848</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3748</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Michael</title>
      <description>&lt;p&gt;Where is the best place to put the customer form builder class?&lt;/p&gt;</description>
      <pubDate>Tue, 17 Jun 2008 02:55:14 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:0676842d-8713-4980-9061-ab0c1cee2be6</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3720</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Michael</title>
      <description>&lt;p&gt;Where is the best place to put the customer form builder class?&lt;/p&gt;</description>
      <pubDate>Tue, 17 Jun 2008 02:55:08 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:09de89d5-5d61-45ba-b77e-b0cc52da20ad</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3719</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by Georg Ledermann</title>
      <description>&lt;p&gt;To avoid HTML validation errors you should write in the LabelFormBuilder class:&lt;/p&gt;


&lt;code&gt;
label = label(field, options.delete(:label), :class =&amp;gt; options.delete(:label_class))
&lt;/code&gt;

	&lt;p&gt;Beware of the &amp;#8220;options.delete&amp;#8221;. Otherwise the inputs will have non-valid attributes &amp;#8220;label&amp;#8221; and &amp;#8220;label_class&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Now you can write:&lt;/p&gt;


&lt;code&gt;
&amp;lt;%= f.text_field :name, :label =&amp;gt; 'Surname' %&amp;gt;
&lt;/code&gt;</description>
      <pubDate>Sat, 14 Jun 2008 09:33:52 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:21f0e5f2-2c54-4995-9e8c-d956c1294cb7</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3709</link>
    </item>
    <item>
      <title>"Advanced Rails Studio: Custom Form Builder" by k</title>
      <description>&lt;p&gt;Thanks!! :)&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;I was just gonna implement this tomorrow morning, and now it's just a copy and paste job. ;-)&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Thanks a lot for sharing!&lt;/p&gt;</description>
      <pubDate>Sat, 14 Jun 2008 00:37:38 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:e30e7e34-a874-455b-8f02-02d6cdf505de</guid>
      <link>http://onrails.org/articles/2008/06/13/advanced-rails-studio-custom-form-builder#comment-3708</link>
    </item>
  </channel>
</rss>
