2012-03-30 45 views
8

Tôi sử dụng tổ tiên để tạo ra một cây mục tiêu. Tôi muốn gửi nội dung của cây đó đến trình duyệt bằng cách sử dụng json.Cách tạo cây json từ tổ tiên

điều khiển của tôi là như thế này:

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

Khi tôi mở file json, tôi nhận được kết quả này:

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

Làm thế nào tôi có thể làm cho nội dung của Goal-đối tượng trong json tập tin?

Tôi đã thử này:

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

nhưng nó không hoạt động, vì @goals là một băm ra lệnh.

+1

Nếu bạn mã định dạng dưới dạng mã (thụt bởi 4 chỗ, hoặc bao quanh với backticks [ '\' ']), bạn không cần phải loại bỏ một cách ngẫu nhiên '<' and '>' s. http://stackoverflow.com/editing-help –

+0

Cảm ơn. Sửa lỗi. –

Trả lời

10

Tôi nhận được sự trợ giúp từ người dùng tại số https://github.com/stefankroes/ancestry/issues/82.

Giải pháp là để đưa phương pháp này trong mô hình mục tiêu:

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 

và sau đó làm cho giao diện điều khiển như thế này:

@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

Có vẻ như bạn không cần tổ tiên thì – SET

+1

Tôi có phải là người duy nhất nhận được thông báo trong nhật ký không? Truy vấn 'N + 1 được phát hiện Thư mục => [: trẻ em] Thêm vào công cụ tìm của bạn:: include => [: children] N + 1 Phương thức truy vấn ngăn xếp cuộc gọi' Tôi đang sử dụng' closure_tree'. – cantonic

2

Lấy cảm hứng từ này 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 
0

Tôi gặp phải vấn đề này vào ngày khác (tổ tiên 2.0.0). Tôi đã sửa đổi câu trả lời của Johan cho các nhu cầu của tôi. Tôi có ba mô hình sử dụng tổ tiên, do đó, nó có ý nghĩa để mở rộng OrderedHash để thêm một phương thức as_json thay vì thêm json_tree vào ba mô hình.

Vì chuỗi này hữu ích nên tôi nghĩ tôi sẽ chia sẻ sửa đổi này.

Set này lên như là một mô-đun hoặc khỉ vá cho 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 

Chúng ta gọi mô hình và sử dụng đó là hành vi json mặc định. Không chắc chắn Nếu tôi nên gọi đến _json hoặc _json. Tôi đã sử dụng as_json ở đây và nó hoạt động trong mã của tôi.

Trong bộ điều khiển

... 
format.json { render :json => @goal.arrange} 
... 
Các vấn đề liên quan