Как создать дерево категорий, используя родословную Ruby on Rails 3
Я пытаюсь сделать дерево категорий, используя родословную Ruby on Rails 3. Мой _form.html.erb
<%= 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>
1 ответ
Решение
Я предполагаю, что вы хотите отобразить список всех категорий сверху вниз в дереве.
Тогда, используя родословную, вы должны полагаться на 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