我想让我的用户能够将表格导出为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。
答案 0 :(得分:10)
我仍然不确定为什么这会解决这个问题,但确实如此。
我将视图中的链接更改为
<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%>
它现在有效!
答案 1 :(得分:0)
我不确定你是否必须这样做,但是如果你生成并保存文件,你可以使用send_file将它发送到浏览器。见http://api.rubyonrails.org/classes/ActionController/Streaming.html
答案 2 :(得分:0)
您可能对我制作的名为CSV shaper的gem感兴趣,它允许您使用非常好的Ruby DSL创建CSV输出。
它还将处理正确设置响应标头,同时允许文件名自定义。