我使用后端Ruby代码生成一个大型CSV文件用于数据库查询,然后通过send_data
将该数据作为命名CSV文件发送。在弹出窗口之前可能需要12分钟才能查看或保存文件显示。
店主要求我放置一个"我们正在编辑您的文件"弹出窗口同时显示。我尝试使用AJAX调用:
$('ul#download-csv li a').on('click', function() {
$("body").addClass("loading");
$('body').append('<p class="waiting">Preparing file for download.</p>');
var url = $(this).attr("href");
$.ajax({
type: 'GET',
url: url,
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
},
async: false
})
.done(function (data) {
$('body').removeClass('loading');
})
.fail(function () {
alert('We encountered an error in processing your request');
$('body').removeClass('loading');
});
});
正如预期的那样,在大约6分钟后完成AJAX调用后,将删除加载类。但是,再过6分钟,窗口就位于弹出窗口之前保存/打开文件。造成额外延误的原因是什么?
这是Ruby控制器:
def download_csv_file
x_model = X.new
x_file_name = ((params[:list]).upcase).to_s
list = List.select('id').where(list_abbreviation: x_file_name)
x_array = Array.new(0)
fname = x_file_name + ".csv"
csvFile = []
query = Y.joins(:z).select('id').where('z.fk_x_id = ?', chemical_list[0])
query.each do |i|
x_query = x_model.get_list_item_for_download(i)
x_array.push(x_query) if !x_query.blank?
end
csvFile.push "HEADER1,HEADER2,HEADER3,HEADER4,HEADER5,HEADER6,HEADER7\n"
x_array.each do |i|
csvFile.push "#{i['x_1'].to_s},#{i['x_2'].to_s},\"#{i['x_3'].to_s}\",#{i['x_4'].to_s},\"#{i['x_5'].to_s}\"\n"
end
send_data csvFile.join, filename: fname, content_type: 'text/csv', disposition: 'attachment'
end
这是Ruby模型:
def get_list_item_for_download(id)
@result_hash = Hash.new(0)
query = Y.joins(:a, :b).select('y.id as y_id, y.c1, y.c2, y.c3, a.id as a_id, a.c1, a.c2, a.c3, min(z.c2) as z_level').where('y.id = ?', id)
(query[0]).attributes.each {|var| @result_hash[var[0].to_sym] = var[1]}
return @result_hash.as_json
end