我正在使用祖先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 /无序列表实现吗?