我正在使用祖先 gem 来允许类别嵌套,并且我希望能够在用户为新产品选择类别时创建一个显示嵌套的下拉列表。
我可以创建嵌套列表,但它使用父类别作为选项组的标签,而不是作为可选元素。
第一次尝试
<%= select_tag "product[category_id]",
option_groups_from_collection_for_select(@store.categories, :children, :name, :id, :name, @product.category.id),
{ include_blank: true } %>
这会产生这样的东西:
<select id="product_category_id" name="product[category_id]">
<option value=""></option>
<optgroup label="Root Category 1"></optgroup>
<optgroup label="Root Category 2">
<option value="3">Child Category 1</option>
</optgroup>
</select>
当我真正想要的只是:
<select id="product_category_id" name="product[category_id]">
<option value=""></option>
<option value="1">Root Category 1</option>
<option value="2">Root Category 2</option>
<optgroup>
<option value="3">Child Category 1</option>
</optgroup>
</select>
其他尝试
我还尝试使用内容标签生成列表:
def grouped_options(categories, selected_id = nil)
body = ''
categories.map do |category|
body << content_tag(:option, category.name, { value: category.id, selected: category.id == selected_id })
if category.children.present?
body << content_tag(:optgroup) do
grouped_options(category.children)
end
end
end
body.html_safe
end
但是,这种方法在 optgroup 标签应该在的列表中留下了空白,并且您不能真正深入 1 级。
所以...
有没有一种方法可以很好地将所有内容嵌套在一个选择中并能够选择每个级别,或者我应该开始考虑使用 javascript/无序列表实现吗?