2013-12-16 9 views
5

Ho bisogno di rendere come Json una struttura complessa. Ho successiva struttura di lavoro:Rails 4 render jested nested objects

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

ma io non sono in grado di aggiungere un attributo porto con alcuni altri attributi nidificati a: barca, come ad esempio: boat_model (allo stesso livello).

UPDATE:

Anche se E'non funziona, includo il mio attributo porta.

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}}]}] 

Voglio dire, boat_model e port sono entrambi attributi della barca.

Questo è l'oggetto del modello:

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

puoi includere ciò che hai provato per aggiungere Port con i suoi attributi nidificati? Inoltre, che aspetto hanno le tue relazioni intorno a Port? –

+0

@Joe Edgar vede l'aggiornamento. – Rober

risposta

3

Probabilmente si sta andando a voler un sistema molto più robusto per la visualizzazione JSON. Gli helper Rails integrati sono progettati principalmente per semplici aggiunte che consentono agli utenti di fare la maggior parte di ciò che vorrebbero realizzare. Tuttavia, nel tuo caso, stai cercando di farlo fare più di quanto è stato progettato per.

Consiglio vivamente di creare uno view object o di utilizzare un gioiello come RABL.

La mia preferenza è utilizzare Rabl per JSON complesso. Fondamentalmente crea "l'oggetto vista" per te costruendo un linguaggio specifico di dominio che rende relativamente facile la costruzione di oggetti JSON complessi in rotaie.

RABL consente fondamentalmente di creare viste che formattano JSON anziché HTML. La DSL è estremamente ricca e ti consente di fare qualsiasi cosa tu voglia. Nel tuo caso, penso che il codice sarebbe simile a questo:

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

Quindi, non è possibile farlo con l'approccio sopra? – Rober

+0

questa è la risposta corretta, rabl è il modo giusto per visualizzare i js nidificati. – kokemomuke