如何渲染 XML 模板,然后在 Ruby on Rails 3.2.8 中使用 SEND_DATA?

Posted

技术标签:

【中文标题】如何渲染 XML 模板,然后在 Ruby on Rails 3.2.8 中使用 SEND_DATA?【英文标题】:How to render XML template and then use SEND_DATA in Ruby on Rails 3.2.8? 【发布时间】:2012-09-18 02:24:57 【问题描述】:

任何人都可以帮助我处理 XML 模板渲染和 send_data 吗?

我有一个控制器:

def show
  @calculation = Calculation.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.json  render json: @calculation 
    format.xml send_data( :partial=>show.xml.erb, :filename => "my_file.xml" ) 
    format.pdf  render :format=>false
  end
end

但我有很多“堆栈级别太深”的错误

如果我使用

send_data( @calculation, :filename => "my_file.xml" ) 

我得到 XML 文件,但不是来自我的模板...

编辑:我有办法!

format.xml do  
  stream = render_to_string(:template=>"calculations/show" )  
  send_data(stream, :type=>"text/xml",:filename => "test.xml")
end

一切正常!

【问题讨论】:

你能发布你的整个跟踪吗? CalculationsController 中的 SystemStackError #show stack level too deep Rails.root: C:/RubyStack-3.2.5-0/examplexml Application Trace |框架跟踪 | Full Trace actionpack (3.2.5) lib/action_dispatch/middleware/reloader.rb:70 我可以在我的 Chrome 中得到结果:format.xml render :format=>false 但只有屏幕,而不是要下载的文件 嘿 Dmitry,考虑发布您的问题并将其标记为解决方案。 @Dmitry - 如果您想将解决方案概括为您自己的答案,我将删除我的答案。 (请参阅 meta.stackexchange.com/questions/90263/… 详细说明为什么这样做会有所帮助。)谢谢! 【参考方案1】:

从已编辑的问题正文中复制答案,以便从“未回答”过滤器中删除此问题:

format.xml do  
  stream = render_to_string(:template=>"calculations/show" )  
  send_data(stream, :type=>"text/xml",:filename => "test.xml")
end

~回答Dmitry

【讨论】:

【参考方案2】:

你可以用 Rails 5 试试这个

respond_to do |format|
  format.html do
    stream = render_to_string(:template => "calculations/test.xml.builder")
    send_data stream,
              :type => 'text/xml; charset=UTF-8;',
              :disposition => "attachment; filename=test.xml"
  end
end

【讨论】:

以上是关于如何渲染 XML 模板,然后在 Ruby on Rails 3.2.8 中使用 SEND_DATA?的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 总结

在 Ruby on Rails 中,如何渲染 JSON?

如何在Ruby on Rails上使用SAX解析器来处理大型XML文件

如何在 Ruby on Rails 中分析请求?

Ruby on Rails 在带有静态脚本文件的视图中渲染

Ruby on Rails 生成模型