9

私は祖先を使ってゴールのツリーを作ります。そのツリーの内容を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 ファイルのゴール オブジェクトのコンテンツをレンダリングするにはどうすればよいですか?

私はこれを試しました:

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

@goals は順序付けられたハッシュであるため、機能しません。

4

3 に答える 3

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
于 2012-03-31T14:19:40.010 に答える
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
于 2013-04-18T11:07:51.087 に答える
1

先日、この問題に遭遇しました (祖先 2.0.0)。必要に応じて Johan の回答を修正しました。祖先を使用する 3 つのモデルがあるため、3 つのモデルに json_tree を追加する代わりに、OrderedHash を拡張して as_json メソッドを追加することは理にかなっています。

このスレッドはとても役に立ちましたので、この変更を共有したいと思います。

これを 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}
...
于 2014-01-31T02:51:15.427 に答える