1

ここでレールプログラマーを始めます。ハッシュをxmlとjsonの両方に変換しようとしていますが、出力が異なります。

ハッシュは次のとおりです。

{:exchangeRates=>[{:baseCurrency=>"USD", :quoteCurrency=>"EUR", :amount=>1, :nprices=>1, :conversions=>[{:date=>Tue, 20 Nov 2012 21:00:00 +0000, :ask=>"0.7813", :bid=>"0.7813"}]}, {:baseCurrency=>"CAD", :quoteCurrency=>"EUR", :amount=>1, :nprices=>1, :conversions=>[{:date=>Tue, 20 Nov 2012 21:00:00 +0000, :ask=>"0.7839", :bid=>"0.7837"}]}]}

対応するレンダリングコードは次のとおりです

format.json { render :json => { :response => rates.to_hash() } }

これがJSONです(これが私が欲しいものです)

{"response": {"exchangeRates": [
    {
        "baseCurrency": "USD",
        "quoteCurrency": "EUR",
        "amount": 1,
        "nprices": 1,
        "conversions": [{
            "date": "2012-11-20T21:00:00+00:00",
            "ask": "0.7813",
            "bid": "0.7813"
        }]
    },
    {
        "baseCurrency": "CAD",
        "quoteCurrency": "EUR",
        "amount": 1,
        "nprices": 1,
        "conversions": [{
            "date": "2012-11-20T21:00:00+00:00",
            "ask": "0.7839",
            "bid": "0.7837"
        }]
    }
]}}

これが私のxmlレンダリングコードです:

format.xml { render :xml => rates.to_hash(), :root => 'response' }

これがxml出力です(配列に配置する場所に追加のタグがあります):

<response>
    <exchangeRates type="array">
        <exchangeRate>
            <baseCurrency>USD</baseCurrency>
            <quoteCurrency>EUR</quoteCurrency>
            <amount type="integer">1</amount>
            <nprices type="integer">1</nprices>
            <conversions type="array">
                <conversion>
                    <date type="datetime">2012-11-20T21:00:00+00:00</date>
                    <ask>0.7813</ask>
                    <bid>0.7813</bid>
                </conversion>
            </conversions>
        </exchangeRate>
        <exchangeRate>
            <baseCurrency>CAD</baseCurrency>
            <quoteCurrency>EUR</quoteCurrency>
            <amount type="integer">1</amount>
            <nprices type="integer">1</nprices>
            <conversions type="array">
                <conversion>
                    <date type="datetime">2012-11-20T21:00:00+00:00</date>
                    <ask>0.7839</ask>
                    <bid>0.7837</bid>
                </conversion>
            </conversions>
        </exchangeRate>
    </exchangeRates>
</response>

ご覧のとおり、追加の「配列」属性タグ、つまりexchangeRatesとコンバージョンが追加されています。これをjsonと同じ形式にするにはどうすればよいですか?また、どのタグにも属性は必要ありません。:root =>'response'などの属性を渡すことができることは知っていますが、かなりの時間を探した後、これらの属性のリストをWeb上で見つけることができないようです。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

1

これは、ソースコードに直接アクセスするのが最善の場合です。to_xmlメソッドはActiveModel::Serializerモジュールにあります。これがインラインドキュメントtype="array"で、属性タグについては何も言及されていません。ただし、もう少し深く掘り下げると、と呼ばれるメソッドの130行目の同じファイルに表示されていることがわかりますadd_associations

rails / activemodel / lib / active_model / serializers / xml.rb:130

type = options[:skip_types] ? { } : {:type => "array"}

skip_typesこれは、どこにも文書化されていないように見える、と呼ばれるオプションがあることを示しています。それをに渡してみてくださいto_xml。そうすれば、目的の動作が得られます。

a = [1, 2, 3]
a.to_xml
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums type=\"array\">\n  <fixnum type=\"integer\">1</fixnum>\n  <fixnum type=\"integer\">2</fixnum>\n  <fixnum type=\"integer\">3</fixnum>\n</fixnums>\n"
a.to_xml(:skip_types => true)
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums>\n  <fixnum>1</fixnum>\n  <fixnum>2</fixnum>\n  <fixnum>3</fixnum>\n</fixnums>\n"

type追加された属性がすべてなくなっていることに気付くでしょう。

したがって、同じオプションをに渡すだけでrender、目的の結果が得られます。

format.xml { render :xml => rates.to_hash(), :root => 'response', :skip_types => true }
于 2012-11-22T00:59:45.807 に答える