Rails 3 - XML ​​Builder - PullRequest
       0

Rails 3 - XML ​​Builder

2 голосов
/ 11 декабря 2010

У меня проблема с файлом index.xml.builder для альбомов изображений;Я уверен, что это что-то простое, но это сводит меня с ума после того, как я не нашел решения в документации Builder :: XmlMarkup.Вот мой текущий вид:

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}"
    }
  }
}

Однако, это производит следующее:

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

Как вы можете видеть, я не могу получить изображения, вложенные в </album>тег.Любые идеи, как это сделать?

Заранее спасибо.

ОБЗОР (Спасибо iain за то, что поставили меня на правильный путь):

Никогда не стоит недооценивать чтение исходного кода, в этом случае Builder :: XmlBase # method_missing.Решением было не передавать строку для содержимого тега (g.name).Это код, который мне был нужен:

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

1 Ответ

4 голосов
/ 11 декабря 2010

Посмотрите еще раз, потому что Builder не генерирует неверный XML.

После того, как заглушить некоторые вещи (заменив галерею и рисунки простыми массивами), вы по сути написали этот код:

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

Что приводит к этому 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> 

Возможно, вы хотите иметь теги img внутри тегов альбома, но ваше собственное вложение не подходит для этого. Отступы вашего кода помогут вам разобраться в этом, и использование блоков do ... end вместо фигурных скобок всякий раз, когда вы используете несколько выровненных блоков, также помогает структуре.

...