Acts_as_tree

Hello,
I’m trying to create categories that have their own subcategories, and
each
subcategory may have its own subcategories, … and so on.

After some reading, I found out that the best way for creating such a
thing
is to use acts_as_tree, but I didn’t find any tutorial or article that
explain this in a clear way. After a lot of work I was finally able to
create categories and subcategories using the following code explained
in
(Agile Web D. With Rails) book:


root = Category.create(:name => “Books”)
fiction = root.children.create(:name => “Fiction”)
non_fiction = root.children.create(:name => “Non Fiction”)
non_fiction.children.create(:name => “Computers”)
non_fiction.children.create(:name => “Science”)
non_fiction.children.create(:name => “Art History”)
fiction.children.create(:name => “Mystery”)
fiction.children.create(:name => “Romance”)
fiction.children.create(:name => “Science Fiction”)

And here is the database scheme:


create table categories (
id int not null auto_increment,
name varchar(100) not null,
parent_id int,
constraint fk_category foreign key (parent_id) references
categories(id),
primary key (id)
);

in the model:

class Category < ActiveRecord::Base
acts_as_tree :order => “name”
end

OK, my problem now is how to view something! Any category name, or any
subcategory or a list of categories, I tried a lot of things, like (in
the
view):


    <% for category in @categories %>
  • <%= link_to h(category.title), :action => 'edit', :id => category %> <%= find_all_subcategories(category) %>
  • <% end %>
----------------------------------------------------------

But I ALWAYS and whatever I try I got this error message:

"You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occured while evaluating nil.each

Extracted source (around line #2): <% for category in @categories %> "

What do you think the problem is?
If you know some tutorial that fully explain how to use acts_as_tree to
add
and show categories that’ll be great

AN@S,

Could you paste your controller code?

  • Jean-Etienne

Jean-Etienne D. wrote:

AN@S,

Could you paste your controller code?

  • Jean-Etienne

In the controller:

def create_categories
root = Category.create(:name => “Books”)
fiction = root.children.create(:name => “Fiction”)
non_fiction = root.children.create(:name => “Non Fiction”)
non_fiction.children.create(:name => “Computers”)
non_fiction.children.create(:name => “Science”)
non_fiction.children.create(:name => “Art History”)
fiction.children.create(:name => “Mystery”)
fiction.children.create(:name => “Romance”)
fiction.children.create(:name => “Science Fiction”)
end

This works and create the categories in the database,

def show_children
display_children(root) #this should show Fiction and Non Fiction
end

I’m really lost, I just want to know how can I show something from
categoreis table in the view

Regards,

On 4/30/07, Eric Harris-Braun [email protected] wrote:

For my app, I needed to modify acts_as_tree (ActiveRecord::Acts::Tree)
such that deleting a node would orphan sub-nodes, rather than deleting
them.

If you have orphaned nodes, how do you know which one is root?

AN@S wrote:

Jean-Etienne D. wrote:

AN@S,

Could you paste your controller code?

  • Jean-Etienne

In the controller:

def create_categories
root = Category.create(:name => “Books”)
fiction = root.children.create(:name => “Fiction”)
non_fiction = root.children.create(:name => “Non Fiction”)
non_fiction.children.create(:name => “Computers”)
non_fiction.children.create(:name => “Science”)
non_fiction.children.create(:name => “Art History”)
fiction.children.create(:name => “Mystery”)
fiction.children.create(:name => “Romance”)
fiction.children.create(:name => “Science Fiction”)
end

This works and create the categories in the database,

def show_children
display_children(root) #this should show Fiction and Non Fiction
end

I’m really lost, I just want to know how can I show something from
categoreis table in the view

Regards,

So, if u have one action which creates categories (code you paste), you
can have another action in your controller to display children of a
given cat:

  • controller:
    def view
    @category = Category.find(params[:id])
    end

  • view (view.rhtml)
    <%= h(@category.name) %>

    <% @category.children.each do |c| -%>
    Child: <%= h(@c.name) %>

    <% end -%>

call ur controller action with an id as param.

For my app, I needed to modify acts_as_tree (ActiveRecord::Acts::Tree)
such that deleting a node would orphan sub-nodes, rather than deleting
them.

If you have orphaned nodes, how do you know which one is root?

The whole point is that I want to be able to represent multiple trees,
not just one. There already is a method “roots” that works just fine
when there are such orphaned nodes. The method “root” ceases really
to have meaning, but that’s fine.

On Sep 8, 11:04 pm, “Carlos Henrique Palhares” [email protected]
wrote:

where I can add a patch to acts_as_tree plugin?

I’m not positive, but I think you’d fork the repo here:

…make a patch according to the basic idea behind these guidelines:

http://rails.lighthouseapp.com/projects/8994/sending-patches

…and create a ticket with your patch here:

http://rails.lighthouseapp.com/projects/8995-rails-plugins

  • Trevor