Search code examples
ruby-on-rails-3jsonancestry

How to generate json tree from ancestry


I use ancestry to make a tree of goals. I would like to send the contents of that tree to the browser using json.

My controller is like this:

@goals = Goal.arrange
respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @goals }
  format.json { render :json =>  @goals}
end

When I open the json file, I get this output:

{"#<Goal:0x7f8664332088>":{"#<Goal:0x7f86643313b8>":{"#<Goal:0x7f8664331048>":{"#<Goal:0x7f8664330c10>":{}},"#<Goal:0x7f8664330e68>":{}},"#<Goal:0x7f86643311b0>":{}},"#<Goal:0x7f8664331f70>":{},"#<Goal:0x7f8664331d18>":{},"#<Goal:0x7f8664331bd8>":{},"#<Goal:0x7f8664331a20>":{},"#<Goal:0x7f86643318e0>":{},"#<Goal:0x7f8664331750>":{},"#<Goal:0x7f8664331548>":{"#<Goal:0x7f8664330aa8>":{}}}

How can I render the contents of the Goal-objects in the json file?

I have tried this:

@goals.map! {|goal| {:id => goal.id.to_s}

but it doesn't work, since @goals is an ordered hash.


Solution

  • I got some help from user tejo at https://github.com/stefankroes/ancestry/issues/82.

    The solution is to put this method in the goal model:

    def self.json_tree(nodes)
        nodes.map do |node, sub_nodes|
          {:name => node.name, :id => node.id, :children => Goal.json_tree(sub_nodes).compact}
        end
    end
    

    and then make the controller look like this:

    @goals = Goal.arrange
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @goals }
      format.json { render :json =>  Goal.json_tree(@goals)}
    end