2016-12-03 67 views
1

我正在使用remote: true選項構建一個非常簡單的單頁Rails應用程序,其中包含一個表單。基本上,該用途會在表單上選擇幾個選項,並使用create.js.erb視圖將一組符合這些要求的產品呈現回頁面。到現在爲止還挺好。我可以使用`remote:true`在Rails表單上下載CSV文件嗎?

我還想讓用戶選擇下載產品的CSV列表。問題是,使用remote: true選項,我無法弄清楚如何實際觸發下載。我可以使用黑客here路由到正確的格式和行動:

<%= button_tag('Download CSV', :value => 'csv', :name => 'format') %> 

def create 
    respond_to do |format| 
    format.js 
    format.csv { send_data @products.to_csv } 
    end 
end 

這幾乎工程;當我單擊「下載CSV」按鈕時,瀏覽器響應中會返回正確的CSV(文本)數據 - 但它不會呈現或觸發文件下載,可能是因爲它是在AJAX響應中返回的。

我可以通過一個鏈接,而不是提交表單,使這項工作(假設行動響應「GET」):

<%= link_to 'Download CSV', products_path(format: :csv) %> 

但是當時我沒有獲得有關用戶數據在窗體參數中捕獲產品需求。

有什麼辦法可以做到這一點嗎?或者我需要失去remote: true並通過HTML(非AJAX)提交表單來觸發CSV下載?

+0

你有沒有想過呢? –

+1

不,我正在使用'value:'csv',name:'format'' hack(在控制器中使用'send_data')。它工作得不錯,但仍然有味道。 – Sasgorilla

+0

我最終在呈現的'js.erb'部分中追加'Download CSV'作爲'button_to'。 –

回答

1

你可以發送一個表單作爲遠程,但返回的JavaScript將打開你的下載網址。

def create 
    respond_to do |format| 
    format.js 
    end 
end 

create.js.erb

window.open("<%= products_path(format: :csv) %>", "_blank") 

這將打開一個新標籤,下載文件,然後關閉它離開原來的頁面。

+0

這會向'products_path'發出GET請求,因此實際上並未提交帶有生成CSV所需參數的表單。 – Sasgorilla

相關問題