2016-12-03 47 views
1

remote: trueオプションを使用して、単一のフォームを持つ非常に単純な単一ページのRailsアプリケーションを構築しています。基本的には、このフォームでいくつかのオプションを選択し、create.js.erbビューを使用して、これらの要件に一致する一連の製品をページにレンダリングします。ここまでは順調ですね。Railsフォームで `remote:true`を指定して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 

。 「Download CSV」ボタンをクリックすると、ブラウザのレスポンスに正しいCSV(テキスト)データが返されますが、AJAXレスポンスで返されるため、レンダリングされず、ファイルのダウンロードが発生しません。

は、私がリンクを使用してではなく、フォームを送信することによって、この作品を作ることができる

(アクションと仮定して「GET」に応答):

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

をしかし、私は約ユーザーデータへのアクセスを持っていませんフォームのパラメータでキャプチャされた製品要件

この作業を行う方法はありますか、remote: trueを失い、HTML(非AJAX)経由でフォームを送信してCSVダウンロードを開始する必要がありますか?

+0

これまでにこれを理解できましたか? –

+1

いいえ、私は 'value: 'csv'、name: 'format''ハックを使っています(コントローラーで' send_data'を使っています)。それは十分にうまくいくが、依然として匂いがする。 – Sasgorilla

+0

レンダリングされた 'js.erb'部分に' button_to'として 'Download CSV'を追加しました。 –

答えて

1

フォームをリモートから送信できますが、ダウンロードURLを開く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

関連する問題