我一直在使用rails的to_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文档,但似乎无法找到任何方法这样做?我是否需要创建一个xml模板并以这种方式呈现?
由于
答案 0 :(得分:1)
我无法想出一个更好的方法来做到这一点,所以我最终得到了一个视图来渲染我想要的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>
答案 1 :(得分: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