2009-08-22 14 views
3

私はBuilder :: XmlMarkupを使用して、RESTful APIサーバー用のXML形式のデータ構造を生成しています。Rails XMLビルダ(かなり縮小されたXML)

最近、Builder :: XmlMarkupからのきれいな印刷が空の要素の代わりに空白の要素ではなく要素を生成したというバグを発見しました。例えば

、このコード:

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

が製造される:内部リストが空リストがある場合

<outertag> 
    <list> 
    </list> 
</outertag> 

は、要素が空でなければならない—すなわち<リスト/>又は<リスト> </list>しかし、実際のXMLは、改行やその他の空白で埋められたリスト>タグ<です。

ビルダーのかわいい印刷を完全に排除するにはどうすればいいですか?現時点では、私は猿のパッチをBuilder :: XmlMarkupを考えているので、初期化では:indentのパラメータは無視されます。私はafter_filterも考慮しています。

答えて

3

インデントパラメータを一切使用しないでBuilder::XmlMarkup.newを呼び出すと、空白が与えられてはなりません。

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

xml # => <outertag><list></list></outertag> 
0

最も一般的に適用できると思われるマットの回答を受け入れます。しかし、私の状況はのURLをすべてというURLに出力するAPIなので、全面的に動作するものが欲しい。

  1. (私の現在のソリューション)サルのパッチのActionView :: TemplateHandlers :: Builderは(マットの答えあたりとして)0インデントを強制する単純なプラグインを作成します。

    は、ここでそのための2つのソリューションです。残念ながら、ActionView :: TemplateHandlers :: Builderは、ほとんどの場合、後で評価されるRubyコードの不透明な文字列です。ここで私はに含める私のメインモジュール、次のとおりです。

    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を処理する必要があることを私に発生し、他に必要なことは何でもしてください。これは、Rackミドルウェアの候補です。だから最終的には、発信XMLを検証して(無効であればアラームなど)、開発モードであればそれをきれいに印刷するか、実稼働環境でコンパクトにする単純なRackミドルウェア層を作成します。

関連する問題