Я столкнулся с чем-то похожим, но при вызове #to_xml в Hash, а не в экземпляре AR.
Я придумал этого помощника:
#
# Returns a new Builder::XmlMarkup that'll handle API's to_xml needs
# Usually you don't need to construct a builder, as to_xml will create one
# however we need some things modified (adding a namespace, XSD-nillable-compliant-nils
# and to_xml is too braindead to allow us to alter such behaviors externally
#
def api_new_xml_builder
builder = Builder::XmlMarkup.new(:indent => 2)
class << builder
def method_missing(*args, &block)
@api_seen ||= 0
@api_seen += 1
if @api_seen == 1
# Root element. Needs some decoration
args[1] ||= {}
args[1]["xmlns"] = "http://my_company.com/api/schemas/xml"
args[1]["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"
end
if args[2].is_a?(Hash) && args[2][:nil] == true
args[2]["xsi:nil"] = true
end
super(*args, &block)
end
end
builder
end
Затем используется так:
builder = api_new_xml_builder
foo.to_xml(:builder => builder)
Обратите внимание, что я решил оставить существующие атрибуты nil = и type = и добавить свой собственный префикс xsi nil, однако вместо этого заменить их тривиально.