这似乎应该是简单的,但我似乎无法找到一个直接的答案。
我添加了一个CSV MIME类型,以及下面似乎工作, 但下载的文件总是被命名为“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
我认为这是使用默认渲染(我还没有实现一个备用渲染器),但我似乎无法找到上的可用选项的完整文档。
是不是有什么像一个“文件名”选项,或东西,我可以使用? 有没有更好的方法吗?
我得到了它,多亏了一些帮助这个答案 。
format.csv do
response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
render "summary/report.csv.erb"
end
首先,你在响应头设置文件名,然后调用render
。
(模板参数去render
是可选的,但对我来说,我需要它。)
你可以通过文件名来send_data
,让它处理内容处理标头。
# 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字符串。
或者您可以使用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