2012-06-18 41 views
4

美好的一天!我想下載自動生成的文件qwerty.csv,但它只返回文本「12345」(沒有文件)。你可以幫我嗎?send_data爲csv文件返回文件的文本,而不是文件

UI

<script type="text/javascript"> 
function getCsv() { 
    var ids = getSelectedRecordIds(); 
    $.post('/payments/form_csv.csv', { ids: ids }, function(data) {}); 
} 
</script> 

控制器

def form_csv 
    csv_string = CSV.generate do |csv| 
     csv << ["12345"] 
    end 

    respond_to do |format| 
     format.csv { 
      send_data csv_string, :type => 'text/csv; charset=utf-8; header=present', :disposition => "attachment; filename=qwerty.csv", :filename => "qwerty.csv" 
     } 
    end 
end 

在控制檯

Started POST "/payments/form_csv.csv" for 127.0.0.1 at 2012-06-18 18:18:11 +0400 
Processing by PaymentsController#form_csv as CSV 
    Parameters: {"ids"=>["18\n\t "]} 
    Rendered text template (0.0ms) 
Sent data qwerty.csv (0.4ms) 
Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.0ms) 

但沒有文件的提示。 ..

+0

也許這只是一個問題,你如何註冊你的應用程序/ MIME類型。當您點擊文件瀏覽器中的* .csv文件時會發生什麼? LibreOffice(或Excel)是否自動打開?未知/未註冊的txt MIME類型可能會始終顯示在您的瀏覽器中。 –

+0

>>當您點擊文件瀏覽器中的* .csv文件時會發生什麼? LibreOffice(或Excel)是否自動打開? 不幸的是,Excel自動打開它=( 非常相似的主題(沒有決定) - http://stackoverflow.com/questions/7597414/how-to-handle-csv-download-prompt-through-a-post -request-in-rails – AnDragFag

+0

@AnDragFag我想這是在瀏覽器上顯示CSV數據的智能瀏覽器的情況。設置這個並希望這有助於'config.action_dispatch.x_sendfile_header =「X-Sendfile」 – Viren

回答

4

噢,它的工作沒有ajax,作爲表單提交!

有本主題中同樣的問題: http://www.ruby-forum.com/topic/111107

使該表單成爲非AJAX形式 我嘗試它,而且它的工作原理!

控制器

def form_csv 
    csv = get_csv 
    send_csv(csv) 
end 

def get_csv 
    result = CSV.generate do |csv| 
     csv << ["12345"] 
    end 
    return result 
end 

def send_csv(csv) 
    send_data csv, :type => 'text/csv; charset=utf-8; header=present', :disposition => "attachment; filename=payments.csv" 
end 

UI

function getCsv() { 
    var ids = getSelectedRecordIds(); 
    params = {ids: ids} 
    post_to_url("/payments/form_csv", params); 
} 

其中post_to_url - 是從 JavaScript post request like a form submit 主題方法。

而且畢竟

protect_from_forgery :except => :form_csv 
在控制器

禁用身份驗證令牌pay_csv請求。

醜陋的決定,但它可以幫助我......可能有更正確的方法嗎?

Viren, 我會試試看,謝謝!