【问题标题】:Rails 3 - set the filename in a respond_toRails 3 - 在 respond_to 中设置文件名
【发布时间】:2014-05-06 18:24:50
【问题描述】:

这似乎应该很简单,但我似乎找不到直接的答案。

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

我认为它使用的是默认渲染器(我尚未实现备用渲染器),但我似乎无法找到有关可用选项的完整文档。

没有类似“文件名”选项或我可以使用的东西吗?有更好的方法吗?

【问题讨论】:

  • 也许这篇文章会有所帮助:stackoverflow.com/questions/617055/…
  • 我以前看过那个帖子,但是因为你的评论,我又看了一遍,它点击了。我现在有一个可行的答案。谢谢。

标签: ruby-on-rails-3 ruby-on-rails-3.2


【解决方案1】:

我明白了,感谢this answer 的帮助。

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

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

render 的模板参数是可选的,但在我的情况下我需要它。)

【讨论】:

  • 尝试此解决方案时,我得到:未定义的局部变量或方法“标题”。知道为什么会发生这种情况吗?该响应对象来自哪里?
  • 好吧...我只是通过做标题而不是 response.headers 来完成这个工作
  • @deakolt - 我无法完全解释 response 变量的来源。我认为它是由ActionController::Base 提供的。也许它是由respond_to 块设置的?没有看到你的代码,我猜不出有什么不同。
  • 在 Rails 3.2 上,我必须在调用渲染之后设置标题 。此建议可能需要更新。
  • On Rails 4 也必须像 yock 所说的那样在渲染之后。
【解决方案2】:

您可以将文件名传递给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

然后将to_csv 方法添加到my_report 或传递预先生成的CSV 字符串。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 根据文档 ":filename - 建议浏览器使用的文件名。"但它不起作用。在 Chrome 中,下载文件会将名称设置为路径的末尾,'path/download.csv'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多