2012-01-11 4 views
5

나는 has_many xml로 렌더링되어야하는 자식 개체가 있습니다. 이것은 문제가되지 않습니다. 내 문제는 파서가 필요로하는 것처럼이 데이터가 포함 된 Hash을 생성했다는 것입니다. 그러나 atomaticly<hash></hash> from format.xml

<hash> 
    <objects type="array"> 
     <object> 
      ... 
      ... 
      ... 
     </object> 
    </objects> 
</hash> 
나는 type="array"을 제거 할 필요가

나는이 문제를 처리 할 수있는 방법 <hash>에 전체 파일을 둘러싸는 레일? 나는 문서에서 아무것도 찾지 못했다.

+0

당신이'to_xml' 방법을 시도 해 봤나 : 여기

은 (config/initializers/rootless_xml.rb에 추가) 않는 방법? http://stackoverflow.com/questions/1739905/how-do-i-convert-a-ruby-hash-to-xml – jibiel

+1

다음과 같이 정확하게 표시됩니다. http://stackoverflow.com/questions/6241911/rails -rendering-xml-adds-hash-tag – jibiel

+0

나머지 부분은 독자적으로 찾았습니다. =>'skip_types => true' – davidb

답변

1
render :xml => @objects.to_xml(:root => :root_name, :skip_types => true) 
+0

이제 내 출력 xml에 태그가 있습니다 ... 읽은 그대로 질문의 의도가 아닙니다. "배열"은 없어졌지만 의 이름이 바뀌 었습니다. 여전히 그대로입니다. – baash05

+0

괜찮아 보이는가? => " : objects, : skip_types => true)> \ N \ n 1 \ n 2 \ n 3 \ n n \」 – Anno2001

7

나는 동일한 문제가있었습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Contacts> 
    <Contact type="array"> 
    </Contact> 
</Contacts> 

I이 사용하던 :

내 XML입니다

entries.to_xml 

은 XML로 해시 데이터를 변환 할 수 있지만, 이것은 <hash></hash>

그래서 수정에 항목의 데이터를 래핑 :

entries.to_xml(root: "Contacts") 

하지만 여전히

<Contacts> 
<Contacts> 
    <Contact type="array"> 
    <Contact> 
    <Name></Name> 
    <Email></Email> 
    <Phone></Phone> 
    </Contact> 
    </Contact> 
</Contacts> 
</Contacts> 

에 '연락처'내 XML 코드를 수정에서 변환 된 XML을 감싸은 그래서 내가 거기 wan't하지 않는 여분의 ROOT를 추가합니다. 나를 위해 일한 무슨이에

이제 솔루션입니다 :<hash></hash> 또는 추가 루트를 피할 수

entries["Contacts"].to_xml(root: "Contacts") 

이 포함되어야한다. 건배 !!

0

실제 XML 사양이 단일 루트을 지정한다는 것을 완벽하게 잘 알고있는 경우에도 XML 의 조각이 필요한 이유는 실제 세계에서 실제로 개발할 때 다양한 이유가 있습니다.

그러나 ActiveSupport의 Hash#to_xml은이 기능을 지원하지 않습니다.

class Hash 
    def to_rootless_xml(options = {}) 
    require 'active_support/builder' unless defined?(Builder) 

    options = options.dup 
    options[:indent] ||= 2 
    options[:root] ||= 'hash' 
    options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent]) 

    builder = options[:builder] 
    builder.instruct! unless options.delete(:skip_instruct) 


    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) } 
    yield builder if block_given? 
    builder.target! 
    end 
end 
관련 문제