事实证明,XML构建器中的分词是非常重要的。
经过一些初步的谷歌搜索后,我发现以下内容是有效的,尽管它不是100%
xml.foo do
xml.id(foo.id)
xml.created_at(foo.created_at)
xml.last_updated(foo.updated_at)
foo.bars.each do |bar|
xml << render(:partial => 'bar/_bar', :locals => { :bar => bar })
end
end
这样就可以了,只是XML输出没有正确缩进。输出类似于:
<foo>
<id>1</id>
<created_at>sometime</created_at>
<last_updated>sometime</last_updated>
<bar>
...
</bar>
<bar>
...
</bar>
</foo>
<bar>
元素应该在<last_updated>
元素下对齐,它是<foo>
的子元素,如下所示:
<foo>
<id>1</id>
<created_at>sometime</created_at>
<last_updated>sometime</last_updated>
<bar>
...
</bar>
<bar>
...
</bar>
</foo>
如果我将内容从bar/_bar.xml.builder复制到模板中,效果会很好,但之后就不是那么简单了。
发布于 2011-06-03 09:15:27
我通过将构建器引用作为局部引用传递到partial中,从而解决了这个问题。不需要对猴子进行修补。使用原始示例:
xml.foo do
xml.id(foo.id)
xml.created_at(foo.created_at)
xml.last_updated(foo.updated_at)
foo.bars.each do |bar|
render(:partial => 'bar/_bar', :locals => {:builder => xml, :bar => bar })
end
end
然后在你的部分中确保使用'builder‘对象。
builder.bar do
builder.id bar.id
end
此外,上面的内容似乎只适用于Rails4。
发布于 2010-06-12 02:57:05
也许你应该这样做:
xml.foo do
xml.id(foo.id)
xml.created_at(foo.created_at)
xml.last_updated(foo.updated_at)
xml.bars do
foo.bars.each do |bar|
xml.bar bar.to_xml # or "xml.bar render(:xml => bar)"
# or "xml.bar render(bar)" (loads bar/_bar partial)
end
end
end
看看this link about the xml builder吧。
在最后一种方法中,您可以将内部循环替换为:
xml.bars render(foo.bars) # will loop over bars automatically using bar/_bar
你也可以尝试一下:
xml << foo.to_xml(:include => :bars)
如果要在结果中包含所有字段。
我不确定所有这些的缩进,所以你可能需要后退来创建内部循环的内容,就像你在外部块中做的一样,例如使用no partial。
https://stackoverflow.com/questions/2986245
复制相似问题