Rails verschachtelt Ressourcen
-
21-08-2019 - |
Frage
Ich versuche, meinen Kopf um verschachtelte Verbände in Rails zu erhalten mit Active. Mein Beispiel ist wie folgt: Was ich habe, ist ein Flughafen mit vielen Laufstegen.
Meine Show Aktion in Flughäfen Controller enthält: @airport = Airport.find (params [: id])
Wenn ich rufe http: //localhost/airports/2.xml ich das Stück XML:
<airport>
<code>DUS</code>
<created-at type="datetime">2009-02-12T09:39:22Z</created-at>
<id type="integer">2</id>
<name>Duesseldorf</name>
<updated-at type="datetime">2009-02-12T09:39:22Z</updated-at>
</airport>
Nun, ich änderte die Aktion
@airport = Airport.find(params[:id], :include => :runways)
Wie kann ich oben Laden oben URL erreichen, dass gibt mir so etwas wie:
<airport>
<code>FRA</code>
<created-at type="datetime">2009-02-12T09:39:22Z</created-at>
<id type="integer">2</id>
<name>Frankfurt</name>
<updated-at type="datetime">2009-02-12T09:39:22Z</updated-at>
<runways>
<runway>
<id>1</id>
<name>bumpy runway</name>
</runway>
</runways>
</airport>
Und obendrein: Wenn ich habe einen Klienten mit
class Airport < ActiveResource::Base
..
end
und
class Runway < ActiveResource::Base
..
end
Wie kann ich es bekommen automatisch laden Assoziationen wie:
a = Airport.find(1)
puts a.runways.length
=> 1
Und (nicht zuletzt): Gibt es eine Möglichkeit, Daten aus dem Client zu speichern, wie:
a = Airport.find(1)
a.runways << Runway.find(1)
a.save
Vielleicht bin ich wirklich zu blind, aber ich bin fest ... Jede Idee, ist herzlich willkommen.
Danke
Matt
Lösung
Die :include
Option für den Finder gibt an, dass es mit Spannung der entsprechenden Elemente aus der Datenbank holen sollte. Die :include
Option für to_xml
gibt an, dass es sollte in dem XML-Rendering einbezogen werden.
Wenn die kanonische XML-Repräsentation der zugehörigen Objekte enthält, können Sie die to_xml
Methode überschreiben, Ihr Leben ein wenig einfacher zu machen:
class Airport
def to_xml(options={})
super(options.merge(:include => :runways))
end
end
und dann seit render
wird to_xml
nennen, wenn Sie nicht, Ihr Controller-Code einfach sein können
format.xml { render :xml => @airport }
Andere Tipps
es mir endlich gelöst. War nicht bewusst, die gehören in die Render statememt zu setzen:
def show
@airport = Airport.find(params[:id], :include => :runways)
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @airport.to_xml(:include => :runways) }
end
end