如何更改Rails 3 to_xml编码

时间:2014-04-14 14:27:52

标签: ruby-on-rails xml ruby-on-rails-3 ruby-2.1

我在模型上使用Rails 3 to_xml ,其中包含一些选项,例如include,except和methods。 所以这不是我第一次使用 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>

但现在我想更改xml编码ISO_8859_1而不是utf8。

我还没有在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>

有没有办法使用ActiveRecord的to_xml指定编码?

1 个答案:

答案 0 :(得分: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