Rails XML构建器无法呈现

时间:2015-05-06 13:49:49

标签: ruby-on-rails xml builder

我遇到了在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 "<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 个答案:

答案 0 :(得分:7)

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