2012-07-04 1 views
0

Я пытаюсь сделать дерево категорий с использованием родословной Ruby On Rails 3. Мой _form.html.erbКак создать дерево категорий с использованием родословной Рубин на Rails 3

<%= form_for(@category) do |f| %> 
<% if @category.errors.any? %> 
<div id="error_explanation"> 
<h2><%= pluralize(@category.errors.count, "error") %> prohibited this category from being saved:</h2> 

<ul> 
<% @category.errors.full_messages.each do |msg| %> 
<li><%= msg %></li> 
<% end %> 
</ul> 
</div> 
<% end %> 

<div class="field"> 
<%= f.label :title %><br /> 
<%= f.text_field :title %> 
</div> 
<div class="field"> 
<%= f.label :ancestry %><br /> 
<%= f.collection_select :ancestry, Category.all(:order => "title"), :id, :title, :include_blank => true %> 
</div> 
<div class="actions"> 
<%= f.submit %> 
</div> 
<% end %> 

Мой index.html.erb

<ul id="menu"> 
<% for category in @categories %> 
<li><%= link_to h(category.title), category %> 
<%= link_to "subcategory", new_category_path(:parent_id => category) %> | 
<%= link_to "Destroy", category, :confirm => "Are you sure?", :method => :delete %> 
<%= link_to 'Show', category %> 
</li> 
<% end %> 
</ul> 

Как изменить индекс, чтобы показать все дерево категорий? Я пытался изменить индекс

<ul id="menu"> 
    <% for category in @categories %> 
    <li><%= category.subtree.all(:order => :title, :limit => 10) %> 
      <%= link_to "subcategory", new_category_path(:parent_id => category) %> | 
     <%= link_to "Destroy", category, :confirm => "Are you sure?", :method => :delete %> 
      <%= link_to 'Show', category %> 
</li> 


    <% end %> 

</ul> 

Но после того, как изменения не могут видеть названия просто

#<Category:0xb5fb731c>#<Category:0xb5fb6fc0> 
+0

вы спрашиваете, как рекурсию через дерево категорий, чтобы показать все дети? – sigre

+0

Да, это то, что мне нужно – nikos83

ответ

3

Я предполагаю, что вы хотите, чтобы отобразить список всех категорий от верхней части к нижней части дерева.

Затем, используя родословную, вы должны положиться на методы roots и children, приведенные в драгоценном камне. Например:

<ul id="menu"> 
    <% Category.roots.each do |category| %> 
    <li> <%= link_to h(category.title), category %> 
     # depending on the depth of your tree it is better to rely on an helper 
     # to drill into the level of the tree 
     <% unless category.children.empty? %> 
      <ul id="sub-menu"> 
      <% category.children.each do |subcategory| %> 
       <li> link_to h(subcategory.title), subcategory </li> 
      <% end %> 
      </ul> 
     <% end %> 
    </li> 
    <% end %> 
</ul> 

Может быть вы найдете следующий фрагмент полезно для рекурсивного подхода: http://dzone.com/snippets/acts-tree-category-display

+0

Тем не менее у меня есть некоторые проблемы. Теперь я могу видеть имена категорий, но только root и подкатегорию не более. Я вижу, что только CategoryLevel1 не может видеть Level2. Корень -CategoryLevel1 --CategoryLevel2 – nikos83

+0

@ user1502296 - Ну код выше, просто отобразите корень и первый слой детей. Если вы хотите, чтобы рекурсивная версия переходила и смотрела на фрагменты, которые я вставил выше. – microcosme