2015-05-06 2 views
1

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

Я создал приложение простых рельсов, чтобы продемонстрировать проблему, с которой я использую построитель для возврата 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 

/тест/контроллеры/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>" 
+0

ли компания вы запрашиваете в тесте существуют в БД? –

+0

Да. Тест создает объект, а затем отображает его. Если я отлаживаю шаблон, я могу отобразить xml просто отлично вручную в сеансе отладки. Однако он не попадает в ответ. –

ответ

6

Похоже, создание экземпляра 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 
+0

Первая часть вашего ответа не имеет значения в соответствии с направляющими Rails: http://guides.rubyonrails.org/layouts_and_rendering.html#wrapping-it-up. –

+0

Вторая часть заставляет его работать! Благодаря! Теперь выяснить, почему. :-) –

+0

Yup, вы правы - красная сельдь. Я не очень хорошо знаком с XmlBuilder –

Смежные вопросы