如何从祖先生成json树



我使用祖先来创建目标树。我想使用json将该树的内容发送到浏览器。

我的控制器是这样的:

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

当我打开json文件时,我得到的输出是:

{"#<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>":{}}}

如何在json文件中呈现Goal对象的内容?

我试过这个:

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

但它不起作用,因为@goals是一个有序的散列。

我从用户tejo那里得到了一些帮助https://github.com/stefankroes/ancestry/issues/82.

解决方案是将这种方法放在目标模型中:

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

然后让控制器看起来像这样:

@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

受此启发https://github.com/stefankroes/ancestry/wiki/arrange_as_array

def self.arrange_as_json(options={}, hash=nil)
  hash ||= arrange(options)
  arr = []
  hash.each do |node, children|
    branch = {id: node.id, name: node.name}
    branch[:children] = arrange_as_json(options, children) unless children.empty?
    arr << branch
  end
  arr
end

前几天(祖先2.0.0)我遇到了这个问题。我根据自己的需要修改了Johan的答案。我有三个使用祖先的模型,因此扩展OrderedHash以添加as_json方法而不是将json_tree添加到三个模型中是有意义的。

由于这个线程非常有用,我想我应该分享这个修改。

将其设置为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

我们调用该模型并使用它的默认json行为。不确定我是应该将调用为_json,还是将调用为_json。我在这里使用了as_json,它在我的代码中起作用。

在控制器中

...
format.json { render :json => @goal.arrange}
...

相关内容

  • 没有找到相关文章

最新更新