Rails to_xml, используйте атрибуты xml вместо дочерних узлов - PullRequest
3 голосов
/ 20 октября 2010

Я возился с рельсом 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"/> и т. д.

Я вылил API-файлы to_xml, но, похоже, не могунайти способ сделать это?Нужно ли создавать XML-шаблон и отображать его таким образом?

Спасибо

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Я не мог придумать более хороший способ сделать это, поэтому я получил представление для рендеринга 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 голосов
/ 27 августа 2013

Вот пример метода, который использует атрибуты, если это возможно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...