Gra*_*ier 19 ruby-on-rails-3 ruby-on-rails-3.2
这似乎应该很简单,但我似乎无法找到一个直接的答案.
我添加了一个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
Run Code Online (Sandbox Code Playgroud)
我认为它使用默认渲染器(我没有实现替代渲染器),但我似乎无法找到有关可用选项的完整文档.
是不是有像"文件名"选项或我可以使用的东西?有更好的方法吗?
Gra*_*ier 37
我得到了它,感谢这个答案的一些帮助.
format.csv do
  response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
  render "summary/report.csv.erb"
end
Run Code Online (Sandbox Code Playgroud)
首先在响应头中设置文件名,然后调用render.
(模板参数render是可选的,但在我的情况下,我需要它.)
小智 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
Run Code Online (Sandbox Code Playgroud)
然后添加to_csv方法my_report或传递预生成的CSV字符串.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           10140 次  |  
        
|   最近记录:  |