2010-08-26 46 views
7

Tôi có một số dữ liệu trong Rails mà tôi muốn hiển thị dưới dạng dữ liệu JSON. Những gì tôi đang làm bây giờ đơn giản là tìm tất cả các cá thể của một Model và gọi render: json => data.Đường ray hiển thị dữ liệu JSON với Model Root

data = Data.find(:all) 
render :json => data 

Tuy nhiên, Rails bao gồm tên mẫu trong mỗi đối tượng JSON. Vì vậy, dữ liệu JSON của tôi kết thúc lên tim như thế này:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}] 

thay vì điều này: [{propertyName: 'value', ...}, {propertyName: 'value2, ...}]

Tên mẫu luôn giống nhau và tôi không muốn nó ở đó.

Tôi đã thay đổi tùy chọn để hiển thị gốc trong dữ liệu JSON trong một bộ khởi tạo Rails nhưng ảnh hưởng đến mọi thứ tôi muốn hiển thị dưới dạng JSON, mà tôi không muốn làm cho dự án này.

Trong trường hợp này, tôi muốn có thể thực hiện việc này theo từng trường hợp.

Tôi làm cách nào để thực hiện việc này? Cảm ơn trước.

Trả lời

2

Tôi không tìm cách làm điều này bằng cách chuyển các tùy chọn tới phương thức to_json (và tôi không tin có một tùy chọn như vậy). Bạn có nhiều lựa chọn thay thế để làm điều này, bất kỳ lớp nào được thừa kế từ ActiveRecord :: Base sẽ có include_root_in_json.

Làm điều gì đó như thế này.

Data.include_root_in_json = false 
data = Data.find(:all) 
render :json => data 

Hy vọng điều này sẽ giúp bạn.

Ok, hãy thử điều này sau đó.

DataController < ApplicationControlle 

    private 

    def custom_json(data) 
    Data.include_root_in_json = false 
    data.to_json 
    Data.include_root_in_json = true 
    data 
    end 
end 

Sau đó chuyển hướng của bạn sẽ trông như thế này

data = Data.find(:all) 
render :json => custom_json(data) 

Nó khá đang ngớ ngẩn Tôi ước gì tôi có thể nghĩ ra một cái gì đó hoàn toàn khác. Hãy để tôi hỏi bạn điều này: Điều gì là nó về việc có tên mô hình bao gồm trong dữ liệu json?

+0

Tôi vừa thử điều này, và thật không may là nó có tác dụng thay đổi hàm include_root_in_json thành false. Tôi đang chạy Rails 2.3.5, nếu điều đó có ích. – CCSab

1

Với Rails 3, tôi thấy cách này tốt hơn để thực hiện. Ghi đè as_json trong mô hình của bạn và làm như sau:

def as_json(options = {}) 
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } }) 
end 
12

Với Rails 3, bạn có thể sử dụng active_model_serializers đá quý 1

cho phép bạn chỉ định vẽ gốc rễ của một đối tượng như thế này:

render :json => data, :root => false 
+0

Điều này làm việc tuyệt vời cho tôi, mặc dù khoảng thời gian đó có thể là dấu phẩy? – stickwithjosh

+1

Cảm ơn bạn, hãy trả lời chỉnh sửa để có dấu phẩy –

Các vấn đề liên quan