Rails 3 - 在respond_to中设置文件名

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是可选的,但在我的情况下,我需要它.)

  • 在Rails 3.2上我必须设置标头_after_调用render.这个建议可能需要更新. (2认同)

小智 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字符串.