Как создать дерево категорий, используя родословную 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

Другие вопросы по тегам