0

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

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

这是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

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

4

1 回答 1

3

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

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

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

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

于 2013-08-14T12:14:06.880 回答