【问题标题】:How do I create sections in a f.select input?如何在 f.select 输入中创建部分?
【发布时间】:2026-01-09 03:05:03
【问题描述】:

我有一个 belongs_to: Category 的帖子模型。

当我创建帖子时,我可以从它所属的类别列表中进行选择。 我的模型类别具有名称和性别属性。 因此,例如,某些类别是“配饰”、“牛仔裤”、“衬衫”(性别为“男性”),而性别“女性”也是如此。

我可以在所有类别的名称前面加上男性或女性,即:“男士牛仔裤”、“女士牛仔裤”,但我更愿意将 f.select 分成两个部分 - “男士”、“女士” ”。看起来像这样的东西:

Men
  Accessories
  Jeans
  etc
Women
  Accessories
  Jeans
  etc

该类别确实具有性别属性,因此我可以通过该属性和 ID 进行区分,因为前 10 个 id 属于男性,接下来的 10 个属于女性。我只是不知道如何在f.select 中显示这一点。这是我目前的select

<%= f.select :category_id, @categories.collect {|c| [ c.name, c.id ]} %>

如往常一样,我们将不胜感激任何帮助!

编辑

好吧,我的辅助方法是

def option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method)
  collection.map do |group|
    option_tags = options_from_collection_for_select(
      group.send(group_method), option_key_method, option_value_method)

    content_tag(:optgroup, option_tags, :label => group.send(group_label_method))
  end.join.html_safe
end

然后选择是

<%= f.select(:type_id, option_groups_from_collection_for_select(@categories, :types, :category, :id, :name)) %>

这获得了正确的类别和类型并且看起来不错,但是当我去编辑帖子时,选择不显示当前选择的项目。

【问题讨论】:

  • 不要把这个逻辑放在视图中。它应该在控制器内部。构建一个数组或散列,其中包含要在控制器中显示的内容,然后在视图中对其进行迭代。

标签: ruby-on-rails ruby twitter-bootstrap ruby-on-rails-4


【解决方案1】:

grouped_collection_select。它看起来像这样:

<%= f.grouped_collection_select(:category_id, Category.top_level, :children, :name, :id, :name %>

【讨论】: