Rails XML builder не рендерит

У меня проблема с отображением XML в теле ответа на запрос в приложении на Rails 4. В приведенном ниже примере тело ответа пустое. Я добавил в шаблон отладчик, так что я знаю, что он проходит через него, но ничего не выдает.

Я создал простое приложение rails, чтобы продемонстрировать проблему, которую я использую, с помощью builder для возврата xml. Может кто-нибудь указать мне (возможно, глупо простой) проблема с этим примером?

Вот контроллер, шаблон и тест:

Контроллеры /bars_controller.rb

require 'builder'

class BarsController < ApplicationController
  before_action :set_bar, only: [:show]

  # GET /bars/1
  # GET /bars/1.json
  def show
    @xml = Builder::XmlMarkup.new
    render template: 'bars/show.xml.builder', formats: [:xml]
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_bar
      @bar = Bar.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def bar_params
      params.require(:bar).permit(:foo, :bar)
    end
 end

/views/bars/show.xml.builder

@xml.instruct!
@xml.bar do
  @xml.foo(@bar.foo)
  @xml.bar(@bar.bar)
end

/test/controllers/bars_controller_test.rb

 require 'test_helper'

 class BarsControllerTest < ActionController::TestCase
  setup do
    @bar = bars(:one)
  end

  test "should show bar" do
    get :show, id: @bar
    assert_response :success
    assert_match "<bar>", response.body
  end
 end

сеанс отладки

     1: @xml.instruct!
     2: binding.pry
  => 3: @xml.bar do
     4:   @xml.foo(@bar.foo)
     5:   @xml.bar(@bar.bar)
     6: end

     [2] pry(#<#<Class:0x007fc669e9f610>>)> @xml.bar do
     [2] pry(#<#<Class:0x007fc669e9f610>>)*   @xml.foo(@bar.foo)  
     [2] pry(#<#<Class:0x007fc669e9f610>>)*   @xml.bar(@bar.bar)  
     [2] pry(#<#<Class:0x007fc669e9f610>>)* end  
      => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><bar><foo>MyString</foo><bar>MyString</bar></bar>"

1 ответ

Решение

Это похоже на создание экземпляра Builder::XmlMarkup.new это твоя проблема. Удалите явное создание компоновщика, чтобы ваш контроллер выглядел так:

def show
  # You can also simplify by removing "bars/"
  render 'bars/show.xml.builder', formats: [:xml]
end

И ваш взгляд должен выглядеть так:

xml.instruct!
xml.bar do
  xml.foo(@bar.foo)
  xml.bar(@bar.bar)
end
Другие вопросы по тегам