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