我对红宝石很新。我有一个问题,如何在一次点击中导出两个文件。
在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
是否可以一键创建两个文件?如果是,我该怎么办?
答案 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
方法