我是红宝石的新手。我有一个问题,如何一键导出两个文件。
在现有版本中,通过调用'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
文件。
无需在内部调用render stream_csv
,只需返回FasterCSV
实例本身或它的String输出即可。从调用方法中,您可以构建一个.zip文件(我这里不包括代码,因为我只是从README
上面的gem进行复制和粘贴)。
最后,不用设置太多标题来强制下载,而要看一下Railssend_file
方法
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句