Gisteren heb ik laten zien hoe je een dutch_date_select helper kunt maken. Het nadeel is echter dat je het niet met form_for kunt gebruiken. Ik heb de helper daarom aangepast zodat deze werkt in form_for. Stop het volgende in de ApplicationHelper.

module ApplicationHelper
  class DutchBuilder < ActionView::Helpers::FormBuilder
    def dutch_date_select(method, *args)
      options = args.extract_options!
      options[:order] = [:day, :month, :year]
      options[:use_month_names] = ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]
      @template.date_select(@object_name, method, options)
    end
  end
end

We maken een eigen FormBuilder class aan die alles van ActionView::Helpers::FormBuilder erft. We stoppen @template ervoor en geven @object_name als object naam mee. Dit is de manier hoe al deze form_for velden worden gemaakt. Nu kunnen we het bijna in een form_for gebruiken. Je moet eerst nog wat toevoegen aan je form_for.

<% form_for @user, :builder => ApplicationHelper::DutchBuilder do |f| %>
...
<% end %>

We geven nu dus aan dat we de DutchBuilder willen gebruiken. Je kunt er ook voor zorgen dat de helper direct in ActionView::Helpers::FormBuilder wordt gestopt, zodat je dit niet hoeft te doen. Hoe dit moet kun je het beste zelf gaan uitzoeken. We kunnen nu de helper in de form_for aanroepen.

<% form_for @user, :builder => ApplicationHelper::DutchBuilder do |f| %>
    <%= f.dutch_date_select :birthday, :include_blank => true %>
<% end %>

Dat was dan de f.dutch_date_select helper. Veel plezier ermee.

EDIT (18 mei 2010 om 13:27)

Hier een verbeterde versie van de helper. Hij werkte namelijk niet goed met accepts_nested_attributes_for.

module ApplicationHelper
    class ActionView::Helpers::FormBuilder
	def dutch_date_select(method, options = {}, html_options = {})
            options[:order] = [:day, :month, :year]
	    options[:prompt] = {:day => 'dag', :month => 'maand', :year => 'jaar'}
            options[:use_month_names] = ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"]
            @template.date_select(@object_name, method, options.merge(:object => @object), html_options)
        end
    end
end