繁体   English   中英

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

[英]How to create multiple CSV file by using FasterCSV in Ruby

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

在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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM