如何在Ruby中使用FasterCSV创建多个CSV文件

时间:2013-08-14 12:01:35

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

我对红宝石很新。我有一个问题,如何在一次点击中导出两个文件。

在exsiting版本中,我可以通过调用'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

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

1 个答案:

答案 0 :(得分:2)

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

的原因

一次发送多个.csv文件的一种方法是将它们合并为一个.zip文件,然后发送 而不是原始.csv文件。您可以使用 rubyzip gem 来构建.zip文件。

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

最后,不要设置这么多标题来强制下载,而是看看Rails send_file 方法