【问题标题】:How can I save the response created by my Rails application?如何保存我的 Rails 应用程序创建的响应?
【发布时间】:2012-07-22 16:58:35
【问题描述】:

我的应用程序中有一些对象(例如任务、联系人等)的 CSV 导出。它只是像这样呈现 CSV 文件:

respond_to do |format|
  format.html
  format.csv { render text: Task.to_csv } # I have self.to_csv def in model
end

当我毫无问题地转到“/tasks.csv”时,它会生成一个 CSV 文件。

现在我想导出所有对象并压缩它们。我正在使用 ruby​​zip gem 来创建 zip 文件。现在我使用所有 CSV 创建 zip 文件的代码如下所示:

Zip::ZipFile.open("#{path_to_file}.zip", Zip::ZipFile::CREATE) do |zipfile|
  zipfile.file.open("tasks.csv", "w") { |f| f << open("http://#{request.host}:#{request.port.to_s}/tasks.csv").read }
  # the same lines for contacts and other objects
end

但它似乎有问题,因为它执行了很长时间(即使 CSV 中只有一行,我也会收到 Timeout::Error),并且生成的 zip-archive 包含一些损坏的东西。

如何将我的“/tasks.csv”、“/contacts.csv”等保存为服务器上的文件(在这种情况下位于 zip-archive 内部)?

【问题讨论】:

  • f &lt;&lt; open("http://...") 这里的open 方法在哪个对象上?
  • 我发现有问题,但我真的不知道如何解决它。 File.open(...) 返回“没有这样的文件”错误。也许我应该使用Net:HTTP 打开那个文件,但我现在还不能让它工作。我希望有一种方法可以在没有 http-responses 的情况下获取此文件。
  • 看来Net:HTTP 不起作用,因为我的应用程序中有用户身份验证。因此,这是找到一种无需 http-responses 的方法的另一个原因。

标签: ruby-on-rails file zip


【解决方案1】:

我做到了!代码是:

Zip::ZipFile.open("#{path_to_file}.zip", Zip::ZipFile::CREATE) do |zipfile|

  zipfile.file.open("tasks.csv", "w") do |f| 
    CSV.open(f, "w") do |csv|
      CSV.parse(Task.to_csv) { |row| csv << row }
    end
  end

end

【讨论】:

  • 不想让您或任何事情感到困惑,但 CSV 不只是一个文本文件吗?为什么要使用 CSV 模块并浪费时间和 CPU?您可以像 File.open(&lt;newfile&gt;, "w") {|f| f.write(File.open(&lt;oldfile&gt;).read)} 一样复制整个文件。但是,如果您确实想使用 CSV,最好选择 FasterCSV,即..erm..faster。
  • 重点是 不存在。它是在我获取 /tasks.csv URL 时生成的。所以,我不能只是打开它并将其内容写入新文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2014-12-25
  • 2018-02-01
  • 2021-05-10
相关资源
最近更新 更多