2013-03-18 60 views
0

我使用Builder在Ruby中創建xml。當我調用generate_object方法兩次時它工作正常。但是,當我在一個循環中進行時,我得到了一些奇怪的結果。兩次輸入都是相同的。Ruby生成器xml

這是代碼。

def generate_xml 
    xml = Builder::XmlMarkup.new 

    #this doesn't work 
    #objects.each do |o| 
    # generate_object xml, o 
    #end 
    #this works... 
    generate_object(xml, objects[0]) 
    generate_object(xml, objects[1])   
end 
def generate_object(builder, object) 
    builder.__send__('ins0', :zObjects, 'xsi:type' => "ins1:account") do |a| 
     object.to_hash.each do |k,v| 
      #puts "key #{k} #{v}!!!!!!!!!!!!!!!!!!!" 
      a.__send__('ins1', k.to_s.zuora_camelize.to_sym, v) unless v.nil? 
     end 
    end 
end 

循環通過對象打印:

<env:Body> 
    <ins0:create> 
    [#<Zuora::Objects::Account:0x007fcd69d61788 
     @changed_attributes={ 
     "auto_pay"=>nil, 
     "currency"=>nil, 
     "batch"=>nil, 
     "bill_cycle_day"=>nil, 
     "status"=>nil, 
     "payment_term"=>nil, 
     "name"=>nil 
     }, 
     @auto_pay=false, 
     @currency="USD", 
     @batch="Batch1", 
     @bill_cycle_day=1, 
     @status="Draft", 
     @payment_term="Due Upon Receipt", 
     @name="test">, 
    #<Zuora::Objects::Account:0x007fcd69d60d10 
     @changed_attributes={ 
     "auto_pay"=>nil, 
     "currency"=>nil, 
     "batch"=>nil, 
     "bill_cycle_day"=>nil, 
     "status"=>nil, 
     "payment_term"=>nil, 
     "name"=>nil 
     }, 
     @auto_pay=false, 
     @currency="USD", 
     @batch="Batch1", 
     @bill_cycle_day=1, 
     @status="Draft", 
     @payment_term="Due Upon Receipt", 
     @name="test 2"> 
    ] 
    </ins0:create> 
</env:Body> 

執行兩個呼叫沒有環:

<env:Body> 
    <ins0:create> 
    <ins0:zObjects xsi:type="ins1:account"> 
     <ins1:AutoPay>false</ins1:AutoPay> 
     <ins1:Batch>Batch1</ins1:Batch> 
     <ins1:BillCycleDay>1</ins1:BillCycleDay> 
     <ins1:Currency>USD</ins1:Currency> 
     <ins1:Name>test</ins1:Name> 
     <ins1:PaymentTerm>Due Upon Receipt</ins1:PaymentTerm> 
     <ins1:Status>Draft</ins1:Status> 
    </ins0:zObjects> 
    <ins0:zObjects xsi:type="ins1:account"> 
     <ins1:AutoPay>false</ins1:AutoPay> 
     <ins1:Batch>Batch1</ins1:Batch> 
     <ins1:BillCycleDay>1</ins1:BillCycleDay> 
     <ins1:Currency>USD</ins1:Currency> 
     <ins1:Name>test 2</ins1:Name> 
     <ins1:PaymentTerm>Due Upon Receipt</ins1:PaymentTerm> 
     <ins1:Status>Draft</ins1:Status> 
    </ins0:zObjects> 
    </ins0:create> 
</env:Body> 
+0

到底哪裏出問題了,當在一個循環的運行呢?說你得到奇怪的結果不會幫助人們找出問題。 – 2013-03-18 20:15:03

+0

如果我正確地解釋它,奇怪的結果是使用循環打印'o.inspect'輸出(第一個輸出),而明確發送每個對象給出xml表示(第二個輸出)。那是對的嗎? – iamnotmaynard 2013-03-18 20:19:36

+0

對,對不起。在通過對象循環的情況下。它打印的東西類似於object.inspect。當我在沒有循環的情況下調用兩次方法時,XML正在正確生成。 – user2183651 2013-03-18 22:59:49

回答

2

看起來你是剛剛的。每個輸出糊塗了什麼你想回來。

嘗試:

def generate_xml 
    xml = Builder::XmlMarkup.new 

    objects.each do |o| 
    generate_object xml, o 
    end 
    # Return the builder object, not the output of .each (the list of objects)! 
    xml 
end 
+0

xml.xml做到了。謝謝! – user2183651 2013-03-18 23:11:02