2014-04-14 1 views
0

임, 포함 및 메소드와 같은 몇 가지 옵션이있는 모델에서 레일 3 to_xml을 사용하여 Im. 이렇게 처음으로 to_xml을 사용하지 않았습니다.레일 3 to_xml 인코딩을 변경하는 방법

to_xml(include: { 
    order: { 
    methods: [:my_avg], 
    except: [:this_attr, :and_this_attr ] 
    }, 
    customer: {} 
}) 

는 XML 결과 :

나는 이런 식으로 뭔가를하고 있어요

<?xml version="1.0" encoding="UTF-8"?> 
<my-model> 
    <attr1 type="integer">12</attr1> 
    <attr2 type="integer">12</attr2> 
    <order> 
    <name>foo</name> 
    <desc>bar</desc> 
    <my-avg> 
     <avg type="integer">123</avg> 
     <foo>ok</foo> 
    </my-avg> 
    </order> 
    <updated-at type="datetime">2014-04-14T11:16:56-03:00</updated-at> 
</my-model> 

을하지만 지금은 UTF8 대신 XML 인코딩 ISO_8859_1을 변경하고 싶습니다.

ActiveRecord :: Serialization 모듈에서 인코딩 옵션을 보지 못했습니다.

단순히 하나 개의 인코딩 그것은 XML 속성을 생성 옵션 대신이 XML에 결과 인코딩 변경 추가하는 경우 :

<?xml version="1.0" encoding="UTF-8"?> 
<my-model> 
    <attr1 type="integer" encoding="ISO-8859-1">12</attr1> 
    <attr2 type="integer" encoding="ISO-8859-1">12</attr2> 
    <order> 
    <name>foo</name> 
    <desc>bar</desc> 
    <my-avg> 
     <avg type="integer">123</avg> 
     <foo>ok</foo> 
    </my-avg> 
    </order> 
    <updated-at type="datetime">2014-04-14T11:16:56-03:00</updated-at> 
</my-model> 

액티브의 to_xml을 사용하여 인코딩을 지정하는 방법이 있나요를?

답변

0

& 인코딩을 지정하면 to_xml을 무시할 수 있습니다. 이런 식으로 작동 할 수 있습니다 :

class ModelName < ActiveRecord::Base 
    def to_xml(options = {}) 
    require 'builder' 
    options[:indent] ||= 2 
    xml = options[:builder] ||= ::Builder::XmlMarkup.new(indent: options[:indent]) 
    xml.instruct! :xml, :version=>"1.0", :encoding => "ISO-8859-1" 
    xml.level_one do 
     xml.tag!(:second_level, 'content') 
    end 
    end 
end 
+0

정상적으로 인코딩 된 XML을 반환하지만 기본 동작을 덮어 썼습니다. "> content AndreDurao

+0

예, 직접 구현해야합니다. 기본적으로 레일스로 보이기 때문에 인코딩을 무시할 수 없으므로 원숭이 패치를하거나 직접 구현해야합니다. 몇 가지 영감을 얻으 려합니다. [여기 레일이있는 방법입니다] (https://github.com/rails/rails/blob/3-2-stable/activemodel/lib/active_model/serializers/xml.rb#L74-L97) – CuriousMind

관련 문제