2010-10-20 3 views
3

J'ai joué avec to_xml de rail, en essayant de créer une interface de repos très simple pour un projet sur lequel je travaille.Rails to_xml, utilisez les attributs xml au lieu des nœuds enfants

Jusqu'à présent, je suis venu avec

cards = Card.all(:conditions => {:racedate => Date.today.to_s}) 
render :xml => cards.to_xml(:include => {:races => { :only => [:id, :number, :race_time, :name] } }, :skip_types => true, :root => "cards")  

dans mon contrôleur.

Cela produit du xml.

<card> 
    <country-code>USA</country-code> 
    <id>55</id> 
    <name>Vernon Downs</name> 
    <races> 
     <race> 
     <id>355</id> 
     <name/> 
     <number>1</number> 
     <race-time/> 
     </race> 
    </races> 
    </card> 

Ce que je voudrais vraiment est d'utiliser des attributs XML plutôt que nœuds enfants, il serait

<card country-code="USA" id=55 name="Vernon Downs"/> etc.

J'ai versé sur les api to_xml docs mais peut » t semble trouver un moyen de le faire? Ai-je besoin de créer un modèle XML et de le rendre ainsi?

Merci

Répondre

0

Je ne pouvais pas comprendre une plus belle façon de le faire, donc j'ai fini en vue de rendre le xml que je voulais.

Code pour toute personne qui est intéressé ..

Controller:

@cards = Card.all(:select => "id,name,country_code,racedate,track_code", :conditions => {:racedate => Date.today.to_s}) 

    response.headers['Content-type'] = 'text/xml; charset=utf-8' 
    render :layout => false 

Vue:

<?xml version="1.0" encoding="UTF-8"?> 
<cards> 
<% @cards.each do |card| -%> 
    <card card-name="<%= card.name %>" id="<%= card.id %>" country-code="<%= card.country_code %>" card-date="<%= card.racedate %>" track-code="<%= card.track_code %>"> 
     <races> 
    <% card.races.each do |race| -%> 
     <race name="<%= race.name %>" id="<%= race.id %>" tote-race-number="<%= race.number %>" post-time="<%= race.race_time %>"></race> 
    <% end -%> 
    </races> 
    </card> 
<% end -%> 
</cards> 
0

Voici un exemple de méthode qui utilise des attributs si elle possible:

def self.format_xml(root, hash, builder = Builder::XmlMarkup.new) 
    # separate apples from oranges 
    enums = {} 
    vals = {} 
    hash.each do |k, v| 
     if Enumerable === v 
     enums[k] = v 
     elsif v.respond_to? :to_s 
     vals[k] = v 
     else 
     fail InvalidValueType, {k => v} 
     end 
    end 
    # build not enumerable values 
    builder.tag!(root, vals) do 
     # recursively call for values from enums 
     enums.each do |k, v| 
     self.format_xml(k, v, builder) 
     end 
    end 
    end 
Questions connexes