質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

10063閲覧

rails send_dataのリダイレクト発生タイミングについて教えてください。

purin

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/07/25 07:57

編集2016/07/25 08:20

###前提・実現したいこと
railsでlink_toを利用してコントローラの処理を呼んでファイルをダウンロードする処理を作成しています。
ファイルのダウンロードの実装自体はうまく機能しているのですが、
ダウンロードを実施している間はLink_toで作成したリンクを非活性にしてかつ
処理中・・・と変更する処理をいれました。
= link_to "出力",csv_download_path,class: 'btn btn-primary detail-icon',data: {disable_with: "出力中"}
上記のようにしたところ、こちらの意図した通り、リンク押下でリンク名は「出力中」になるのですが、処理が終わっても元にもどりません。

コントローラーでsend_dataを利用しているのでファイルのダウンロードが完了したら、リダイレクトが発生してリンクの名称が元に戻ると考えていたのですが、違うのでしょうか?
ファイルの保存先をしているする画面が表示される前にリンクの名称が変化するので
見た目上は
①disable_withによる非活性化とリンク名の変更
②send_data
の順番で処理は実施されているように見えます。
拙い内容ではございますが、ご教授いただければ幸いです。宜しくお願いいたします。

エラーメッセージ

エラーメッセージは出力されていません。

###該当のソースコード
ruby (rails,slim)
・view
= link_to "出力",csv_download_path,class: 'btn btn-primary detail-icon',data: {disable_with: "出力中"}

・controller
def csv_download
前提計算処理・・・
send_data(csv.output(visit_care), filename: "achievement_#{statrt_month.strftime("%Y/%m/%d")}_#{last_month.strftime("%Y/%m/%d")}.csv", disposition: 'attachment')
end

###試したこと controllerでsend_data処理後にredirect_toで画面更新の呼び出しを追加 →エラーとなる ###補足情報(rails/rubymine/)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

通常のアクセスの場合、send_dataでも、send_fileでも、renderでも、レスポンスはレスポンスとして扱うので、全てのデータを受け取ったかどうかをサーバー側で判別し、残りの処理を行う事は出来ません。
ですから、send_dataのあと、redirect_toを行ったときには、double render errorが返ったかと思います。

対策としては、link_toのアクセスをjavascriptのAjaxで行うしかないかと思います。
コントローラ側は現状のsend_dataのまま、リクエストのリンククリックイベントをJavascriptでとらえて、Ajaxアクセスを開始、全データが送り終わったかどうかは、その際のイベントで受けて、そこから正常アクセスでリダイレクトするのがいいかと。

投稿2016/07/25 15:40

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

purin

2016/07/26 00:17

返信遅くなりましてすみません。 javascriptのAjaxを使うしかないのですね。Ajaxを利用して実装する方向で考えることに いたします。 丁寧な回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問