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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top