I am trying to render the following Dendrogram from my Rails app: http://bl.ocks.org/mbostock/4063570
I have a model with many attributes, but I would like to manual
First, lets look at what d3.json
does.
d3.json("/assets/flare.json", function(root) {
// code that uses the object 'root'
});
This loads the file /assets/flare.json
from the server, interprets the contents as JSON and passes the resulting object as the root
argument to the anonymous function.
Where you already have a JSON object, you don't need to use the d3.json
function - you can just use the object directly.
var root = {
"name": "flare",
"children": [
...
]
};
// code that uses the object 'root'
If the object is represented as a string, then you can use JSON.parse
to get the object:
var myString = '{"name": "flare","children": [ ... ] }';
var root = JSON.parse(mystring);
// code that uses the object 'root'
Second, lets look at what d3.layout.cluster
expects of your data. As per the docs:
... the default children accessor assumes each input data is an object with a children array ...
In other words, you data needs to be of the form:
var mystring = '{
"name": "Product",
"children": [
{
"name": "id",
"type": "number",
"description": "Product identifier",
"required": true
},
...
{
"name": "stock",
"type": "object",
"children": [
{
"name: "warehouse",
"type": "number"
},
{
"name": "retail",
"type": "number"
}
]
}
]
}
d3.json actually takes URL as an argument, so instead of giving it the path to the file, I would suggest to delegate data management to the controller (especially, if in future you would need to load it from DB), so to simplify things:
class YourFlareController < ApplicationController def load @data = File.read("app/assets/json/flare.json") render :json => @data end end
get "yourflare/load"
d3.json("http://host/yourflare/load", function(root) {