Question

I'm trying to make category tree using ancestry Ruby on Rails 3. My _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 %>

My 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>

How should I change index to show all category tree? I was trying to change index to:

<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>

But after change can't see titles just: #<Category:0xb5fb731c>#<Category:0xb5fb6fc0>

Was it helpful?

Solution

I assume you want to display the list of all the categories from the top to the bottom of the tree.

Then using ancestry you have to rely on the roots and children methods given in the gem. For instance:

<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>

May be you will find the following snippet usefull for the recursive approach: http://dzone.com/snippets/acts-tree-category-display

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top