Rails XML构建器无法呈现

我在Rails 4应用程序中的请求的响应主体中呈现XML时遇到问题。 在下面的示例中,响应正文为空白。 我在模板中放了一个调试器,所以我知道它贯穿它但不会渲染任何东西。

我创建了一个简单的rails应用程序来演示我使用构建器返回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 "", 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(#<#>)> @xml.bar do [2] pry(#<#>)* @xml.foo(@bar.foo) [2] pry(#<#>)* @xml.bar(@bar.bar) [2] pry(#<#>)* end => "MyStringMyString" 

看起来像创建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