【问题标题】:Rails - CSV export: prompt for file downloadRails - CSV 导出:提示文件下载
【发布时间】:2011-01-03 21:49:07
【问题描述】:

我想让我的用户能够将表格导出为 CSV。

所以在我的控制器中,我在文件顶部添加了:

  respond_to :html, :js, :csv

如果请求的格式是 csv,我也会设置标题:

if params[:format] == 'csv'
  generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}") 
end

generate_csv_headers(在 application_controller 中)的代码是:

  def generate_csv_headers(filename)
    headers.merge!({
      'Cache-Control'             => 'must-revalidate, post-check=0, pre-check=0',
      'Content-Type'              => 'text/csv',
      'Content-Disposition'       => "attachment; filename=\"#{filename}\"",
      'Content-Transfer-Encoding' => 'binary'
    })
  end

我还创建了一个名为 index.csv.erb 的视图来生成我的文件:

<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @negotiations.each do |n| -%>
<%- row = [ n.id,
            n.name ] -%>
<%=   CSV.generate_line row %>
<%- end -%>

我没有任何错误,但它只是显示 CSV 文件的内容,而我希望浏览器提示下载文件。

我读了很多书,但找不到任何有用的东西。 你有什么想法吗?

谢谢,p.

【问题讨论】:

标签: ruby-on-rails csv


【解决方案1】:

我仍然不确定为什么这解决了问题,但它确实解决了。

我将视图中的链接更改为

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>

现在可以了!

【讨论】:

    【解决方案2】:

    我不确定你必须这样做,但如果你生成并保存文件,你可以使用 send_file 将它发送到浏览器。见http://api.rubyonrails.org/classes/ActionController/Streaming.html

    【讨论】:

    • 两件事:我正在动态生成数据,我注意到我不能写文件(我在 Heroku 上)。
    【解决方案3】:

    您可能对我制作的这个名为 CSV shaper 的 gem 感兴趣,它允许您使用非常好的 Ruby DSL 创建 CSV 输出。

    它还将处理正确设置响应标头,同时允许自定义文件名。

    https://github.com/paulspringett/csv_shaper

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2014-03-10
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多