2010-10-20 42 views
3

我一直在玩rail的to_xml,試圖爲我正在開發的項目創建一個非常簡單的休息界面。Rails to_xml,使用xml屬性而不是子節點

到目前爲止,我想出了

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")  
在我的控制器

這產生了一些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> 

我真正喜歡的是使用XML屬性,而不是子節點,所以這將是

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

我已經倒在to_xml API文檔,但可以」 t似乎找到了這樣做的任何方式?我是否需要創建一個xml模板並進行渲染?

感謝

回答

0

我無法找出一個更好的辦法做到這一點,所以我結束了一個視圖渲染XML作爲我想要的。

代碼的人那是興趣..

控制器:

@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 

查看:

<?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

下面是一個使用,如果它的屬性可能的方法的例子:

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 
相關問題