Rails: рендеринг XML добавляет тег <hash>

У меня есть контроллер Rails, который выводит хэш в формате XML - например:

class MyController < ApplicationController
  # GET /example.xml
  def index        
    @output = {"a" => "b"}

    respond_to do |format|
      format.xml  {render :xml => @output}
    end
  end
end

Однако Rails добавляет <hash> тег, который я не хочу, т.е.:

<hash>
  <a>
    b
  </a>
</hash>

Как я могу просто вывести это вместо?

<a>
  b
</a>

Ответы

Ответ 1

Я думаю, что если вы конвертируете объект в XML, вам нужен тег, который обертывает все, но вы можете настроить имя тега для обертки:

def index        
  @output = {"a" => "b"}

  respond_to do |format|
    format.xml  {render :xml => @output.to_xml(:root => 'output')}
  end
end

Это приведет к:

<output>
  <a>
    b
  </a>
</output>

Ответ 2

У меня была такая же проблема;

Это мой XML:

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

Я использовал это:

entries.to_xml

для преобразования хэш-данных в XML, но это переносит данные записей в <hash></hash>

Итак, я изменил:

entries.to_xml(root: "Contacts")

но это все еще завернуло преобразованный XML в "Контакты". меняя свой XML-код на

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

Таким образом, он добавляет лишний ROOT, который я там не там.

Теперь решение для меня помогло:

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

что позволяет избежать <hash></hash> или любого дополнительного корня, который должен быть включен. Ура!!