Отображать навигацию с бесконечными вложенными элементами в массиве - PullRequest
0 голосов
/ 23 января 2012

У меня есть модель Category, в которой name:string categoryId:integer parent_id:integer categoryId не имеет значения, в этом случае я знаю, что она не соответствует соглашению об именах RoR, но у меня есть веские причины для этого ... Модель выглядит следующим образом:

has_many :children, :class_name => 'Category', :foreign_key => 'parent_id'
belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'
....
...
..
scope :top_categories, where("parent_id IS NULL")

У меня была похожая проблема с представлением здесь , и это работает хорошо, но теперь мне нужно выпадающее меню со всеми категориями, отображаемыми в его иерархии.Это действительно мешает мне, я просто не понимаю!Я хочу, чтобы верхние категории, включая детей, и дети должны включать ее детей, ... Как я могу отобразить это в массиве?

Мне нужны эти данные для collection_select, который должен отображать всю навигацию, ноне в одной области, я хочу отобразить это так:

Top-Category1
---Sub-Category1
------Sub-Category1-1
------Sub-Category1-2
---Sub-Category2
Top-Category2
---Sub-Category1

Кто-нибудь может мне помочь?

// Решил это так:

  def self.recursive_categories(categories, prefix='')
            c = []
            categories.collect do |cat|
                    current = Struct::Category.new
                    current.id = cat.id
                    current.name =  "#{prefix}#{cat.name}"
                    c << current
                    if cat.children
                           c += recursive_categories( cat.children, prefix + '--' )
                    end
            end
            c
  end

Я определилStruct::Category в ApplicationHelper, который включен в ApplicationController.Затем я использовал это, чтобы отобразить его в виде:

<%= f.collection_select :category_id, Category.recursive_categories(Category.top_categories), :id, :name %>

Ответы [ 2 ]

1 голос
/ 23 января 2012

Довольно простая рекурсия для подготовки массива выбора для select:

# in a helper
def recursive_options categories, prefix=''
  c = []
  categories.collect do |cat|
    c << [ prefix + cat.name, cat.id ]
    if cat.categories
      c += recursive_options( cat.categories, prefix + '--' )
    end
  end
  c
end

# then in your view somewhere
<%= f.select :category_id, recursive_options( Category.top_categories )
0 голосов
/ 23 января 2012

Это отобразит все категории в виде ссылок

module CategoriesHelper
  def render_categories(categories, level = 1)
    buffer = ""
    categories.each do |category|
      buffer +=link_to category.name, "#"
      buffer +="<br/>"
      unless category.sub_categories.blank?
        buffer +="&nbsp;&nbsp;&nbsp;&nbsp;"*level
        buffer +=render_categories(category.sub_categories, level+=1)
      end
    end
    return buffer
  end
end

на ваш взгляд

<%= render_categories(Category.top_level).html_safe %>

Если вы хотите это в форме выбора, вот ссылка на сообщение, как это сделать, япогуглил, сам не пробовал.http://www.rabbitcreative.com/2008/02/01/turn-an-acts_as_tree-structure-into-a-select-drop-down/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...