2009-03-04 27 views
27

Tôi rất muốn sử dụng render :json nhưng có vẻ như nó không linh hoạt. Whats đúng cách để làm điều này?hiển thị: json không chấp nhận các tùy chọn

respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @things } 

    #This is great 
    format.json { render :text => @things.to_json(:include => :photos) } 

    #This doesn't include photos 
    format.json { render :json => @things, :include => :photos } 
end 

Trả lời

39

Tôi đã làm điều tương tự với render :json. Đây là những gì làm việc cho tôi:

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @things.to_json(:include => { :photos => { :only => [:id, :url] } }) } 
end 
+0

Cảm ơn, điều này đã giúp tôi. – swilliams

+0

Giúp tôi. +1 – sscirrus

1
format.json { render @things.to_json(:include => :photos) } 
34

Tôi đoán bài viết này có thể hữu ích cho bạn - Rails to_json or as_json? bởi Jonathan Julian.

Ý nghĩ chính là bạn nên tránh sử dụng to_json trong bộ điều khiển. Nó linh hoạt hơn nhiều để định nghĩa phương thức as_json trong mô hình của bạn.

Ví dụ:

Trong mô hình Thing của bạn

def as_json(options={}) 
    super(:include => :photos) 
end 

Và sau đó bạn có thể viết trong điều khiển của bạn chỉ

render :json => @things 
+0

đây có lẽ là giải pháp tốt nhất cho vấn đề này .. – giosakti

+2

Có thể muốn thực hiện 'super (options.merge (: include =>: photos))' để bảo toàn các tùy chọn có thể có khác. Bạn vẫn sẽ ghi đè bất kỳ tùy chọn ': include' nào, mặc dù ... logic cho việc hợp nhất các giá trị cho khóa đó sẽ có liên quan nhiều hơn một chút. –

+0

Sử dụng 'super options.reverse_merge: include =>: photos' sẽ cho phép bạn ghi đè" default ": include. (Xem [Hash # reverse_merge] (http://api.rubyonrails.org/classes/Hash.html#method-i-reverse_merge)) – Steve

1

trong trường hợp mảng những gì tôi làm là

respond_to do |format| 
    format.html 
    format.json {render :json => {:medias => @medias.to_json, :total => 13000, :time => 0.0001 }} 
end 
3

Quản lý băm phức tạp trong bộ điều khiển của bạn trở nên xấu xí nhanh chóng.

Với Rails 3, bạn có thể sử dụng ActiveModel :: Serializer. Xem http://api.rubyonrails.org/classes/ActiveModel/Serialization.html

Nếu bạn đang làm bất kỳ điều gì không tầm thường, hãy xem https://github.com/rails-api/active_model_serializers. Tôi khuyên bạn nên tạo các lớp serializer riêng biệt để tránh làm lộn xộn các mô hình của bạn và làm cho các bài kiểm tra dễ dàng hơn.

class ThingSerializer < ActiveModel::Serializer 
    has_many :photos 
    attributes :name, :whatever 
end 

# ThingsController 
def index 
    render :json => @things 
end 

# test it out 
thing = Thing.new :name => "bob" 
ThingSerializer.new(thing, nil).to_json 
Các vấn đề liên quan