【问题标题】:How to create multiple CSV file by using FasterCSV in Ruby如何在 Ruby 中使用 FasterCSV 创建多个 CSV 文件
【发布时间】:2013-08-14 12:01:35
【问题描述】:

我对红宝石很陌生。我有一个问题,如何一键导出两个文件。

在现有版本中,我一次只能通过调用 'def stream_csv' 生成一个文件,但是当我尝试调用它两次以获取两个文件时,我收到一条错误消息,指出“ActionController::DoubleRenderError” (每个动作只能渲染或重定向一次):“我猜是因为渲染。

这里是stream_csv的源代码:

def stream_csv
    require 'fastercsv'

        filename = params[:action] + ".csv"

        #this is required if you want this to work with IE      
        if request.env['HTTP_USER_AGENT'] =~ /msie/i
            headers['Pragma'] = 'public'
            headers["Content-type"] = "text/plain"
            headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0'
            headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
            headers['Expires'] = "0"
        else
            headers["Content-Type"] ||= 'text/csv'
            headers["Content-Disposition"] = "attachment; filename=\"#{filename}\""
            controller.response.headers["Content-Transfer-Encoding"] = "binary"
        end

        render :text => Proc.new { |response, output|
            csv = FasterCSV.new(output, :row_sep => "\r\n")
            yield csv
        }
    end
end

是否可以一键创建两个文件?如果是,我该怎么做?

【问题讨论】:

    标签: ruby-on-rails csv export-to-csv fastercsv


    【解决方案1】:

    你说得对,是因为render。当您设置headers,然后最终调用render 时,您正在构建要发送到浏览器的HTTP 响应。您不能从一个 HTTP 请求执行此操作两次,这就是您获得 ActionController::DoubleRenderError 的原因。

    一次发送多个.csv 文件的一种方法是将它们组合成一个.zip 文件并发送那个而不是原始.csv 文件。有一个非常好用的rubyzip gem,您可以使用它来构建您的.zip 文件。

    您可以简单地返回FasterCSV 实例本身或其字符串输出,而不是在stream_csv 中调用render。通过调用方法,您可以构建一个 .zip 文件(我在这里不包括该代码,因为我只是从上面 gem 的 README 复制和粘贴)

    最后,与其设置那么多header来强制下载,不如看看Rails send_file方法

    【讨论】:

    • 感谢您的帮助,其中包含非常清楚的解释:)
    • 很高兴为您提供帮助,并且您可以自行整理代码。
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多