我正在使用Rails 3.我想创建一个选择标记,其中一些选项已分组,另一些未分组。选项看起来像这样:
Income
Auto
Fuel
Maintenance
Home
Maintenance
Mortgage
在这个例子中,收入不是一个群体,而是自动和家庭。
我看到了三种辅助方法grouped_options_for_select
和grouped_collection_select
,option_groups_from_collection_for_select
,但它们似乎都要求每个选项都有一个组。
有没有办法使用帮助器来执行此操作,还是我必须自己生成HTML?我想我可以使用两个不同的帮助器来创建选项,只需追加两者的结果。
答案 0 :(得分:2)
没有现成的帮手(我知道)可以做你需要的。这有点困难,因为它将取决于您的数据模型。它是数组,哈希,父子或多对多关系吗?
假设它是父子,你可以使用递归来构建它:
def child_options_for_select(collection, children_method, group_label_method, child_value_method, child_label_method, options = {})
body = ''
collection.each do |item|
children = item.send(children_method)
if item.children.count != 0
body << content_tag(:optgroup, child_options_for_select(children, children_method, group_label_method, child_value_method, child_label_method, options), :label => item.send(group_label_method))
else
body << content_tag(:option, item.send(child_label_method), :value => item.send(child_value_method))
end
end
body.html_safe
end
视图中的用法示例:
<%= select_tag 'foo', child_options_for_select(@categories.roots, :children, :to_s, :id, :to_s) %>
请注意,这是相当缓慢的,因为它涉及到数据库的多次往返。
答案 1 :(得分:0)
以Aarons的答案为出发点,我制作了一个以Hash
为输入的版本。
def grouped_and_ungrouped_options_for_select(grouped_options, selected_key = nil)
body = ''
grouped_options.each do |key, value|
selected = selected_key == value
if value.is_a?(Hash)
body << content_tag(:optgroup, grouped_and_ungrouped_options_for_select(value, selected_key), :label => key)
else
body << content_tag(:option, key, value: value, selected: selected)
end
end
body.html_safe
end