2013-12-16 17 views
5

Muszę renderować jako Json złożoną strukturę. Mam Dalej Praca strukturę:Rails 4 render json zagnieżdżonych obiektów

render :json => @booking, :include => [:paypal, 
             :boat_people, 
             :boat => {:only => :boat_model, :include => {:boat_model => {:only => :name, :include => { :boat_type => {:only => :name}}}}}] 

ale nie jestem w stanie dodać atrybut portu z innymi zagnieżdżonych atrybutów: łodzi, takich jak: boat_model (na tym samym poziomie).

UPDATE:

Chociaż its nie pracuje, ja to mój atrybut portu.

render :json => @booking, :include => [:paypal, 
             :boat_people, 
             :boat => {:only => [:boat_model => {:include => {:boat_model => {:only => :name, :include => { :boat_type => {:only => :name}}}}}, 
                  :port => {:include => :city => {:only => name}}]}] 

To znaczy, boat_model i port są atrybutami łodzi.

Jest to obiekt model:

class Boat < ActiveRecord::Base 

    attr_accessor :price 
    @price 

    attr_accessor :extrasPrice 
    @extrasPrice 

    def as_json(options = { }) 
    h = super(options) 
    h[:price] = @price  
    h[:extrasPrice] = @extrasPrice 
    h 
    end 


    belongs_to :boat_model 
    belongs_to :port 
    belongs_to :state 
    has_many :photos 
end 
+0

Czy możesz dołączyć to, czego próbujesz, aby dodać Port z jego zagnieżdżonymi atrybutami? Jak wyglądają twoje relacje związane z Portem? –

+0

@Joe Edgar zobacz aktualizację. – Rober

Odpowiedz

19

Mam to.

render :json => @booking, :include => [:paypal, 
             :boat_people, 
             :boat => {:only => :name, :include => {:port => {:only => :name, :include => {:city => {:only => :name, :include => {:country => {:only => :name}}}}}, 
               :boat_model => {:only => :name, :include => {:boat_type => {:only => :name}}}}}] 
3

Prawdopodobnie będzie chciał o wiele bardziej wytrzymałe system wyświetlania JSON. Wbudowane pomocniki Rails zostały zaprojektowane z myślą o prostych dodatkach, które umożliwiają użytkownikom wykonywanie większości zadań, które chcieliby osiągnąć. Jednak w twoim przypadku próbujesz sprawić, by działał on bardziej, niż został zaprojektowany.

Gorąco polecam albo utworzenie view object lub użycie klejnotu jak RABL.

Moim wyborem jest użycie Rabl dla złożonego JSON. Zasadniczo tworzy on dla ciebie "obiekt widoku", budując język specyficzny dla domeny, który sprawia, że ​​stosunkowo łatwo budować złożone obiekty JSON w szynach.

RABL zasadniczo pozwala budować widoki formatujące JSON zamiast HTML. DSL jest niezwykle bogaty i umożliwia robienie wszystkiego, co tylko chcesz. W twoim przypadku kod powinien wyglądać mniej więcej tak:

app/views/bookings/show.rabl 

object @booking 
#these are attributes that exist on your booking model: 
attributes :booking_attribute, :other_booking_attribute 

child :paypal do 
    #these are attributes that exist on your paypal model: 
    attributes :paypay_attribute1, :other_paypal_attribute 
end 

child :boat_people do 
    #boat_people attributes that you want to include 
    attributes :blah_blah 
end 

child :boat do 
    #boat attributes that you want to include 
    attributes :boat_attribute1, :boat_attribute2 

    child :boat_model do 
    attributes :name 

    child :boat_type do 
     attributes :name 
    end 
    end 

end 
+0

Więc nie można tego zrobić za pomocą powyższego podejścia? – Rober

+0

to jest poprawna odpowiedź, rabl jest właściwą metodą renderowania zagnieżdżonych jsonów. – kokemomuke

Powiązane problemy