Le hachage d'attributs supplémentaires n'est pris en charge que dans Rails 3.
Si vous êtes sur Rails 2.x et que vous voulez passer outre options_for_select
J'ai simplement copié le code de Rails 3. Vous devez surcharger ces 3 méthodes :
def options_for_select(container, selected = nil)
return container if String === container
container = container.to_a if Hash === container
selected, disabled = extract_selected_and_disabled(selected)
options_for_select = container.inject([]) do |options, element|
html_attributes = option_html_attributes(element)
text, value = option_text_and_value(element)
selected_attribute = ' selected="selected"' if option_value_selected?(value, selected)
disabled_attribute = ' disabled="disabled"' if disabled && option_value_selected?(value, disabled)
options << %(<option value="#{html_escape(value.to_s)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{html_escape(text.to_s)}</option>)
end
options_for_select.join("\n").html_safe
end
def option_text_and_value(option)
# Options are [text, value] pairs or strings used for both.
case
when Array === option
option = option.reject { |e| Hash === e }
[option.first, option.last]
when !option.is_a?(String) && option.respond_to?(:first) && option.respond_to?(:last)
[option.first, option.last]
else
[option, option]
end
end
def option_html_attributes(element)
return "" unless Array === element
html_attributes = []
element.select { |e| Hash === e }.reduce({}, :merge).each do |k, v|
html_attributes << " #{k}=\"#{ERB::Util.html_escape(v.to_s)}\""
end
html_attributes.join
end
C'est un peu compliqué mais c'est une option. Je place ce code dans un module d'aide appelé RailsOverrides
que j'inclus ensuite dans ApplicationHelper
. Vous pouvez aussi faire un plugin/gemme si vous préférez.
Un problème est que pour profiter de ces méthodes, vous devez toujours appeler options_for_select
directement. Des raccourcis comme
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id, {"data-stuff"=>"html5"} ] })
donnera les anciens résultats. Au lieu de cela, cela devrait être :
select("post", "person_id", options_for_select(Person.all.collect {|p| [ p.name, p.id, {"data-stuff"=>"html5"} ] }))
Encore une fois, ce n'est pas une solution idéale, mais cela peut valoir la peine d'accéder à l'attribut data, toujours aussi utile.
2 votes
Rails ne fournit pas cette fonctionnalité, vous devrez créer un assistant pour créer ce balisage. N'oubliez pas non plus que l'exemple que vous avez mentionné n'est pas du HTML valide.
0 votes
Je sais, mon exemple n'est pas valide en html... Je suppose que je dois changer ma façon de faire pour obtenir les résultats que je veux, merci !