Rails Helpers: f.dutch_date_select
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

ongeveer 2 jaar geleden
met prompt erbij heel netjes :D