Ruby on rails 3 Rails 3-在响应中设置文件名

Ruby on rails 3 Rails 3-在响应中设置文件名,ruby-on-rails-3,ruby-on-rails-3.2,Ruby On Rails 3,Ruby On Rails 3.2,这似乎应该很简单,但我似乎找不到一个直截了当的答案 我添加了一个csv mime类型,下面的方法似乎有效,除了下载的文件总是命名为“report.csv” 在我的控制器中: def report respond_to do |format| format.html format.csv do render :template => "summary/report.csv.erb", :filename => "foo" #do

这似乎应该很简单,但我似乎找不到一个直截了当的答案

我添加了一个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
我认为它使用的是默认的渲染器(我还没有实现替代的渲染器),但我似乎无法在可用的选项中找到完整的文档


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

我知道了,多亏了他的帮助

首先在响应头中设置文件名,然后调用
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

然后将
添加到_csv
方法添加到
我的_报告
或传递预生成的csv字符串。

或者,您可以使用发送数据和渲染到字符串的组合(因为您有一个csv模板)


也许这篇文章会有所帮助:我以前看过这篇文章,但由于你的评论,我又看了一遍,它点击了。我现在有了一个有效的答案。谢谢。尝试这个解决方案时,我得到了:未定义的局部变量或方法“headers”。知道为什么会这样吗?那个反应对象是从哪里来的?好吧。。。我只是通过做标题而不是回复来实现这一点。headers@deakolt-我无法完全解释
响应
变量的来源。我想它是由我们提供的。可能是由
respond\u to
块设置的?在没有看到您的代码的情况下,我猜不出有什么不同。在Rails 3.2上,我必须在调用render后设置头。此建议可能需要更新。正如yock所说,在Rails 4上也必须在渲染之后。根据文档“:filename-建议浏览器使用的文件名。”但它不起作用。在Chrome中,下载文件时,它会将名称设置为路由的末尾,“path/download.csv”
# 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
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