2012-01-11 20 views
5

Ho un oggetto che gli oggetti figlio has_many devono essere visualizzati come xml. Questo non è un problema. Il mio problema è che creo un Hash contenente questi dati come il parser ha bisogno. Ma rotaie atomaticly racchiude l'intero file conCome rimuovere <hash></hash> da format.xml

<hash> 
    <objects type="array"> 
     <object> 
      ... 
      ... 
      ... 
     </object> 
    </objects> 
</hash> 

ho bisogno di sbarazzarsi del type="array" e la <hash> come posso gestire questa situazione? Non ho trovato nulla sulla documentazione.

+0

Hai provato 'metodo to_xml'? http://stackoverflow.com/questions/1739905/how-do-i-convert-a-ruby-hash-to-xml – jibiel

+1

Sembra che questo è esattamente il vostro caso http://stackoverflow.com/questions/6241911/rails -rendering-xml-adds-hash-tag – jibiel

+0

Grazie a te che ho fatto una parte ho trovato il resto da solo => ': skip_types => true' – davidb

risposta

1
render :xml => @objects.to_xml(:root => :root_name, :skip_types => true) 
+0

Ora ho il tag nel mio xml uscita ... Non l'intento della questione, come ho letto. La "matrice" è sparita, ma lo è appena stato rinominato .. è ancora come lì. – baash05

+0

sembra a posto :? [1,2,3] .to_xml (radice: =>: oggetti,: skip_types => true) => " \ N \ n \ n \ n \ n \ n " – Anno2001

7

Stavo avendo lo stesso problema;

Questo è il mio XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Contacts> 
    <Contact type="array"> 
    </Contact> 
</Contacts> 

stavo usando questo:

entries.to_xml 

per convertire i dati hash in XML, ma questo avvolge i dati voci in <hash></hash>

Così ho modificato :

entries.to_xml(root: "Contacts") 

ma che ancora avvolto l'XML convertito in 'Contatti' modificare il mio codice XML per

<Contacts> 
<Contacts> 
    <Contact type="array"> 
    <Contact> 
    <Name></Name> 
    <Email></Email> 
    <Phone></Phone> 
    </Contact> 
    </Contact> 
</Contacts> 
</Contacts> 

Quindi aggiunge una radice in più che io non wan't lì.

Ora soluzione a questo che cosa ha funzionato per me è:

entries["Contacts"].to_xml(root: "Contacts") 

che evita <hash></hash> o qualsiasi radice aggiuntivo da includere. Saluti !!

0

Ci sono una serie di motivi quando si fa lo sviluppo effettivo nel mondo reale perché potrebbero essere necessari frammenti di XML anche se si è perfettamente consapevoli del fatto che la specifica XML specifica una singola radice.

Tuttavia, l'del ActiveSupport Hash#to_xml non supporta questa.

Qui è un metodo che non (aggiungere in config/initializers/rootless_xml.rb):

class Hash 
    def to_rootless_xml(options = {}) 
    require 'active_support/builder' unless defined?(Builder) 

    options = options.dup 
    options[:indent] ||= 2 
    options[:root] ||= 'hash' 
    options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent]) 

    builder = options[:builder] 
    builder.instruct! unless options.delete(:skip_instruct) 


    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) } 
    yield builder if block_given? 
    builder.target! 
    end 
end