19

这似乎应该很简单,但我似乎无法找到一个直接的答案。

我添加了一个 csv mime-type,以下似乎工作,除了下载的文件总是命名为“report.csv”。

在我的控制器中:

def report
  respond_to do |format|
    format.html
    format.csv do
      render :template => "summary/report.csv.erb",
             :filename => "foo" #doesn't work
    end
  end
end

我认为它使用的是默认渲染器(我尚未实现备用渲染器),但我似乎无法找到有关可用选项的完整文档。

没有像“文件名”选项或我可以使用的东西吗?有更好的方法吗?

4

3 回答 3

38

我明白了,感谢这个答案的一些帮助。

format.csv do
  response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
  render "summary/report.csv.erb"
end

首先在响应头中设置文件名,然后调用render.

(模板参数render是可选的,但就我而言,我需要它。)

于 2012-10-15T19:50:54.793 回答
7

您可以将文件名传递给send_data并让它处理 Content-Disposition 标头。

# config/initializers/csv_support.rb
ActionController::Renderers.add :csv do |csv, options|
  options = options.reverse_merge type: Mime::CSV
  content = csv.respond_to? :to_csv ? csv.to_csv : csv.to_s
  send_data content, options
end

# app/controllers/reports_controller.rb
respond_to do |format|
  format.html ...
  format.csv { render csv: my_report, filename: 'my_report.csv' }
end

然后添加一个to_csv方法my_report或传递一个预先生成的 CSV 字符串。

于 2013-10-07T02:51:15.077 回答
4

或者,您可以使用 send_data 和 render_to_string 的组合(因为您有一个 CSV 模板)。

def report
  respond_to do |format|
    format.html
    format.csv do
      send_data render_to_string(:template => "summary/report.csv.erb"),
             :filename => "foo"
    end
  end
end
于 2014-05-06T10:24:50.767 回答