【发布时间】: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