2015-02-24 3 views
0

Мне нужно скачать файлы через успех запроса ajax. Я написал ajax-код, как описано ниже. Обработка запроса ajax в контроллере. Он отправляет данные. Но я видел как предупреждение. Я тоже положил дело. Он преобразует, но не может загрузить.Как получить файл csv через ajax в рельсах

Может ли кто-нибудь помочь мне решить эту проблему?

Ajax:

email_download_file = function(id, email) { 
    if(id !== null){ 
     $('#customButton').attr('disabled','disabled'); 
     var jqxhr = $.post('/orders/csv/download', { 
      email: email, 
      emaillist_type: $('#emaillist_type').val(), 
      nrecords: $('#no_of_records_selected').val() 
     }).done(function(data) { 
      alert(data); 
     }).fail(function() { 
      $('#customButton').removeAttr('disabled'); 
      alert("There was a problem with us receiving your data. Please refresh this page and try again. Or contact us at [email protected] We're sorry this happened! :("); 
     }).always(function() { 
     }); 
    } 
} 

контроллер:

def order_download 
     begin 
      email = params[:email] 
      emaillist_type = params[:emaillist_type] 
      num_records = params[:nrecords] 
      email_records = EmailList.where(emaillist_type: emaillist_type).limit(num_records.to_i) 
      send_data email_records.to_csv, type: "text/csv; charset=iso-8859-1; header=present", disposition: "attachment;filename=#{emaillist_type}.csv" 
     rescue Exception => e 
      render :nothing, status: 401 
     end 
    end 

модель:

def self.to_csv 
     CSV.generate do |csv| 
      csv << ["First Name","Last Name","Designation","Email","Industry","Company Name","Website","City","Country"] 
      all.each do |l| 
       csv << [l.firstname,l.lastname,l.designation,l.email,l.industry,l.company_name,l.website,l.city,l.country] 
      end 
     end 
    end 

ответ

1

Я боюсь, что вы не можете скачать файл с помощью AJAX. Для этого вы должны попробовать выполнить отдельный запрос.

Попробуйте отправить параметры как отправку формы (потому что ваш контроллер действия ожидает запрос POST). Может быть, что-то вроде этого на ваш взгляд?

<form action="/orders/csv/download" target="_blank"> 
    <input type="hidden" name="email" value="..." /> 
    <input type="hidden" name="emaillist_type" value="..." /> 
    <input type="hidden" name="nrecords" value="..." /> 
</form> 

Вы заметили, что я использовал target="_blank" в form теге? Это может создать впечатление, что запрос был выполнен асинхронно, что далеко не так, как вы пытаетесь достичь, но это то, с чего вы можете начать!

Если вы действительно хотите использовать AJAX как файл для скачивания, возможно, это то, что вы могли бы попробовать? (https://stackoverflow.com/a/9970672/4381282 - PS. Я не пробовал это самостоятельно, но это кажется разумным!) Я не уверен, что он поддерживает запросы POST.

Удачи вам!