没有漂亮打印的Rails XML构建器(即缩小的XML)

我正在使用Builder :: XmlMarkup为RESTful API服务器生成XML格式的数据结构。

最近,我发现了一个错误,其中来自Builder :: XmlMarkup的漂亮打印产生了一个充满空白文本的元素,而不是应该是空元素。

例如,这段代码:

xml.outertag do xml.list do # Some code which loops through a list end end 

正在生产:

     

当内部列表是空列表时,该元素必须为空 – 即或 。 但是实际的XML是一个标签,其中填充了换行符和其他空格。

那么,如何完全消除Builder漂亮的印刷呢? 目前,我正在考虑使用猴子修补Builder :: XmlMarkup,以便初始化忽略:indent参数; 虽然我也在考虑使用after_filter。

在没有任何缩进参数的情况下调用Builder::XmlMarkup.new不应该给你任何空格。

 xml = Builder::XmlMarkup.new xml.outertag do xml.list do # Some code which loops through a list end end xml # =>  

接受马特的答案似乎是最普遍适用的。 但是,由于我的情况是为每个 URL输出XML的API,我希望能够全面运行的东西。

以下是两种解决方案:

  1. (我目前的解决方案)制作一个简单的插件,猴子修补ActionView :: TemplateHandlers :: Builder来强制0缩进(根据Matt的回答)。 不幸的是,ActionView :: TemplateHandlers :: Builder主要是一个不透明的Ruby代码字符串,稍后会进行eval()编辑。 这是我的主要模块,我包括在:

     module MinimalXml module Builder def self.included(base) base.class_eval do def compile(template) indent = 0 "_set_controller_content_type(Mime::XML);" + "xml = ::Builder::XmlMarkup.new(:indent => #{indent});" + "self.output_buffer = xml.target!;" + template.source + ";xml.target!;" end end end end end 
  2. (可能是未来的解决方案。)在我看来,一个严肃的基于XML的Web服务需要处理传入和传出的XML,validation它并做任何其他必要的事情。 这是Rack中间件的一个很好的候选者。 因此,最终我预见自己会编写一个简单的Rack中间件层,它将validation传出的XML(如果它是无效的,则发出警报等),然后在开发模式下将其打印出来,或者在生产中将其压缩。