Rails 3中 - 设置文件名中的respond_to(Rails 3 - set the fil

2019-08-01 12:01发布

这似乎应该是简单的,但我似乎无法找到一个直接的答案。

我添加了一个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

我认为这是使用默认渲染(我还没有实现一个备用渲染器),但我似乎无法找到上的可用选项的完整文档。

是不是有什么像一个“文件名”选项,或东西,我可以使用? 有没有更好的方法吗?

Answer 1:

我得到了它,多亏了一些帮助这个答案 。

format.csv do
  response.headers['Content-Disposition'] = 'attachment; filename="' + filename + '.csv"'
  render "summary/report.csv.erb"
end

首先,你在响应头设置文件名,然后调用render

(模板参数去render是可选的,但对我来说,我需要它。)



Answer 2:

你可以通过文件名来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字符串。



Answer 3:

或者您可以使用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


文章来源: Rails 3 - set the filename in a respond_to