2013-03-28 8 views
6

Diciamo che ho una classe Persona e una classe GangCome delegare al metodo to_builder di un modello da una vista JBuilder?

class Person 
    belongs_to :gang 
    attr_accessible :name, :secret 

    def to_builder 
    Jbuilder.new do |app| 
     person.id id 
     person.name name 
    end 
    end 
end 

class Gang 
    has_many :people 
    attr_accessible :name 
end 

Come posso utilizzare questo metodo to_builder da un punto di vista?

Per esempio

#app/views/gang/show.json.jbuilder (@gang set by the controller) 

json.gang do |json| 
    json.name @gang.name 
    json.gang_members(@gang.people) do |person| 
    #how do I delegate to the person.to_builder here? 
    end 
end 

Intendiamoci, io non mai desidera utilizzare il default Person.as_json, perché io non voglio rendere l'attributo secret sulla Persona.

La maggior parte delle cose che ho provato hanno finito per rendere l'equivalente di Person.as_json, non di Person.to_builder.

risposta

6

È possibile utilizzare Jbuilder#attributes!. Intendo

json.gang do |json| 
    json.name @gang.name 
    json.gang_members @gang.people.map { |person| person.to_builder.attributes! } 
end 
+5

E per un singolo oggetto al livello superiore? Come in un gang_member # show.json azione? –

2

Utilizzare Jbuilder#merge! per unire gli attributi dal generatore persona.

json.gang do 
    json.name @gang.name 
    json.gang_members(@gang.people) do |person| 
    json.merge! person.to_builder.attributes! 
    end 
end 
Problemi correlati