2012-03-30 2 views
8

나는 조상을 사용하여 목표 트리를 만듭니다. json을 사용하여 해당 트리의 내용을 브라우저에 보내고 싶습니다.조상에서 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의 목표 - 객체의 내용을 렌더링 할 수 있습니다 내가 JSON 파일을 열 때

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

,이 출력을 얻을 파일? @goals가 정렬 된 해시이기 때문에,

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

을했지만 작동하지 않습니다

나는이 시도했다.

+1

에서

(4 공백으로 오목하거나 역 따옴표로 둘러싸는 [ '\' '])을 임의로'<' and '>'s의 제거하지 않는다. http://stackoverflow.com/editing-help –

+0

감사합니다. 고쳤다. –

답변

10

사용자 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 
+2

당신이 조상을 필요로하지 않는 것 같아요. – SET

+1

로그에서 메시지를받는 사람은 제가 유일합니까? 'N + 1 쿼리가 감지되었습니다. 디렉토리 => [: children] 찾기 :> 포함 => [: children] N + 1 쿼리 메소드 호출 스택' 'closure_tree'를 사용하고 있습니다. – cantonic

0

에서 영감을

이 솔루션은 목표 모델에서이 방법을 넣어하는 것입니다 나는 다른 일 (조상 2.0.0)이 문제로 만났다. 나는 요한의 대답을 나의 필요에 맞게 수정했다. 조상을 사용하는 세 가지 모델이 있으므로 세 모델에 json_tree를 추가하는 대신 as_json 메서드를 추가하도록 OrderedHash를 확장하는 것이 좋습니다.

이 스레드는 매우 유용했기 때문에이 수정 사항을 공유 할 것이라고 생각했습니다. 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} 
...