1

我有一个表类别,其中包含 3 个字段 id 名称 parent_category_id

类别和子类别都存储在与 parent_category_id 相同的类别表中

例子:

id--------------姓名-------parent_category_id

1-------------类别1--------无

2------------ subCategory11----------------1

3------------子类别12----------------1

4-------------Catogory2---------无

5--------------subCategory21----------------4

6--------------subCategory22----------------4

我正在尝试从这样的类别模型中构建一个选择框

选择框:

category1
    subcategory11
    subcategory12
category2
    subcategory21
    subcategory22

用户可以选择 category1 或 subcategory11

如何在Rails3.2中制作这样的下拉框

4

2 回答 2

1

您可以使用options_for_select辅助方法为您的选择字段创建自定义选项:http: //apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select

用于创建数组的递归方法,您可以将其传递给options_for_select它,如下所示:

def subcat_prefix(depth)
  (" " * 4 * depth).html_safe
end

def category_options_array(categories=[], parent_id=nil, depth=0)
  Category.where(parent_category_id: parent_id).order(:id).each do |category|
    categories << [subcat_prefix(depth) + category.name, category.id]
    category_options_array(categories, category.id, depth+1)
  end

  categories
end

要使用该方法,例如:

select_tag :category_id, options_for_select(category_options_array)

请注意,这适用于许多级别的子类别。要改变选择字段的外观,您可以定义subcat_prefix不同的方法或使用类和 CSS 来设置选项标签的样式。

于 2013-09-20T20:09:14.787 回答
0

我为此使用“awesome_nested_set”gem。使用起来非常流畅。

宝石'awesome_nested_set'

如果您已经有一个带有 parent_id 的类别表,则将以下 3 列添加到您的表中

add_column :categories, :lft, :integer
add_column :categories, :rgt, :integer
add_column :categories, :depth, :integer

如果您有自定义 parent(something_parent_id) id 而不是 parent_id 然后作为自定义 parent_id 的选项传递,例如:

act_as_nested_set :parent_column => :parent_category_id

当你想用作选择框时

f.select :parent_id, nested_set_options(Category, @category) {|i| "#{'-' * i.level} #{i.name}" }

或者

 select_tag 'parent_id', options_for_select(nested_set_options(Category) {|i| "#{'-' * i.level} #{i.name}" } )
于 2013-09-22T03:50:43.387 回答