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.
I ran into this problem the other day (ancestry 2.0.0). I modified Johan's answer for my needs. I have three models using ancestry, so it made sense to extend OrderedHash to add a as_json method instead of adding json_tree to three models.
Since this thread was so helpful, I thought I'd share this modification.
Set this up as a module or monkey patch for ActiveSupport::OrderedHash
def as_json(options = {})
self.map do |k,v|
x = k.as_json(options)
x["children"] = v.as_json(options)
x
end
end
We call the model and use it's default json behavior. Not sure If I should call to_json or as_json. I've used as_json here and it works in my code.
In the controller
...
format.json { render :json => @goal.arrange}
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With