' SEND_DATA'与AJAX调用结束不对应

时间:2016-06-14 20:38:46

标签: jquery ruby-on-rails ruby ajax csv

我使用后端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

0 个答案:

没有答案