2010-12-10 50 views
2

Je rencontre un problème avec mon fichier index.xml.builder pour les albums photo; Je suis sûr que c'est quelque chose de simple mais ça me rend fou après ne pas trouver une solution dans les docs Builder :: XmlMarkup. Voici mon avis actuel:Rails 3 - XML ​​Builder

xml.instruct! 
xml.gallery { 
@albums.each { |g| 
    xml.album(g.name, {:title => g.name, 
        :description => g.description, 
        :lgpath => "[PATH]", 
        :tnpath => "[PATH]", 
        :fspath => "[PATH]"}) 
    g.pictures.each { |p| 
     xml.img nil, :src => "#{p.resource_file_name}" 
    } 
    } 
} 

Cependant, cela produit les suivants:

<gallery> 
    <album title="..." description="..." lgpath="..." tnpath="..." fspath="..."></album> 
    <img src="17112.jpg"/> 
    <img src="17113.jpg"/> 
    <img src="17114.jpg"/> 
    <img src="17115.jpg"/> 
    <album... 

Comme vous pouvez le voir, je suis incapable d'obtenir les images imbriquées dans la balise </album>. Des idées pour y arriver?

Merci d'avance.

RÉCAPITULATION (Merci à IAIN pour me mettre sur la bonne voie):

jamais sous-estimer la lecture du code source, dans ce cas Builder :: XMLBase # method_missing. La solution était de ne pas passer une chaîne pour le contenu de la balise (g.name). Voici le code que je avais besoin:

xml.instruct! 
xml.gallery do 
    @albums.each do |g| 
    xml.album(:title => g.name) do 
     g.pictures.each do |p| 
     xml.img(:src => p.resource_file_name) 
     end 
    end 
    end 
end 

Répondre

4

Regardez à nouveau, parce que Builder ne génère pas XML non valide.

Après stubbing certaines choses (en remplacement de la galerie et des images avec des tableaux simples), vous essentiellement écrit ce code:

xml.instruct! 
xml.gallery do 
    [1, 2, 3].each do |g| 
    xml.album g.to_s, :title => g.to_s, :fspath => "[PATH]" 
    [4, 5, 6].each do |p| 
     xml.img nil, :src => "#{p}.gif" 
    end 
    end 
end 

Quels sont les résultats de cette XML:

<?xml version="1.0" encoding="UTF-8"?> 
<gallery> 
    <album title="1" fspath="[PATH]">1</album> 
    <img src="4.gif"></img> 
    <img src="5.gif"></img> 
    <img src="6.gif"></img> 
    <album title="2" fspath="[PATH]">2</album> 
    <img src="4.gif"></img> 
    <img src="5.gif"></img> 
    <img src="6.gif"></img> 
    <album title="3" fspath="[PATH]">3</album> 
    <img src="4.gif"></img> 
    <img src="5.gif"></img> 
    <img src="6.gif"></img> 
</gallery> 

Vous voulez probablement Avoir les img-tags dans les balises d'album, mais votre propre imbrication est fausse pour cela. Indenter votre code vous aidera à le comprendre, et en utilisant do ... end blocs au lieu de accolades, chaque fois que vous utilisez plusieurs blocs lignés aide la structure aussi.

+0

Merci pour votre aide. Vous avez raison en ce que j'ai manqué la balise de l'album et que, en effet, je veux imbriquer les images. Je ne peux pas identifier l'erreur de mon chemin parce que j'appelle g.pictures dans la portée du bloc de galerie. Je suis sûr que mon erreur est stupide stupide, donc je vais continuer à brancher ... – TMB

+0

appelez le g.pictures à l'intérieur d'un bloc pour l'album et vous devriez être prêt à partir. Vous pourriez vouloir faire du nom de l'album un tag ou un attribut – iain