创建一个选择标记,其中一些选项已分组,另一些未分组

时间:2011-01-02 05:44:39

标签: ruby-on-rails ruby-on-rails-3

我正在使用Rails 3.我想创建一个选择标记,其中一些选项已分组,另一些未分组。选项看起来像这样:

Income
Auto
  Fuel
  Maintenance
Home
  Maintenance
  Mortgage

在这个例子中,收入不是一个群体,而是自动和家庭。

我看到了三种辅助方法grouped_options_for_selectgrouped_collection_selectoption_groups_from_collection_for_select,但它们似乎都要求每个选项都有一个组。

有没有办法使用帮助器来执行此操作,还是我必须自己生成HTML?我想我可以使用两个不同的帮助器来创建选项,只需追加两者的结果。

2 个答案:

答案 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