我使用祖先制作目标树。我想使用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-objects的内容?
我试过这个:
@goals.map! {|goal| {:id => goal.id.to_s}
但它不起作用,因为@goals是一个有序的哈希。
答案 0 :(得分:11)
我在https://github.com/stefankroes/ancestry/issues/82处获得了tejo用户的帮助。
解决方案是将此方法放在目标模型中:
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
答案 1 :(得分:2)
灵感来自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)
前几天我遇到了这个问题(祖先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}
...