2013-03-18 229 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