1

PDFを生成してユーザーに提供するform_tagがあります。最終的な send_data は次のようになります。

send_data pdf.render, type: 'application/pdf', :filename => filename, :compress => true

これは標準フォームでは正常に機能しますが、ajax を使用して :remote => true を設定しようとすると機能しません。

私がやりたい最終的なことは、pdfの生成中にボタンを無効にするために :disable_with を使用することです。

これを修正する方法についてのアイデアはありますか?

4

3 に答える 3

1

これは古いスレッドであることは知っていますが、他の誰かが私と同じようにここで道を見つけた場合に備えて、これを機能させる方法をお知らせしたいと思いました。

リクエストに ajax を使用する際の問題は、レスポンス (pdf ファイル) を処理してユーザーにファイルとして提供することがほぼ不可能であるため、気にしないでください。代わりに、キャッシングに組み込まれた Rails を使用して、生成後に PDF を提供しました。

  1. リンクが「従来どおり」機能する:remote => true, :disable_with => 'loading...'ようになったら、リンクに を追加して ajax 化します。

  2. config.action_controller.perform_caching = true構成 > 環境 > development.rb で設定して、本番 =p にプッシュする前にこれが機能していることを確認できるようにします。

  3. ダウンロード アクションでアクション キャッシングを使用し、必要に応じて適切な有効期限を設定します。つまりcaches_action :download, :expires_in => 5.minutes、コントローラーの上部に設定します。

    これは、リンクをクリックすると ajax リクエストが送信され、pdf が生成され、ページが返されることを意味します。ページがキャッシュされるようになったため、リンクをもう一度クリックすると、リクエストに数秒ではなく数ミリ秒かかります。次に行う必要があるのは、準備ができたら PDF をダウンロードするための小さな JavaScript です。

  4. ただし、javascript を (目立たないかどうかに関係なく) 以下を追加します。

$("#download_link").on('ajax:success', function(){
    document.location = $(this).attr("href")
});

:remote => trueこれにより、ブラウザは ajax リクエストが成功すると (つまり、pdf が生成されると) リンクが存在しないかのようにリンクをたどるようになります。応答はキャッシュされているため、すぐにダウンロードされます。

于 2012-11-15T23:52:34.193 に答える
0
  1. リモート リンクを使用してレンダリング プロセスを開始する
  2. サーバーにバックグラウンド ジョブを開始させて PDF を作成し、ユーザーにジョブ ID を返します。
  3. JavaScript を使用してタイマーでサーバーをポーリングし、ジョブ ID を送信して完了したかどうかを尋ねます。
  4. 完了したら、PDF をダウンロードできるページにユーザーをリダイレクトします。
于 2012-05-07T01:41:09.560 に答える
0

OK、さまざまな AJAX コールバックを使用する必要があります。

ページに PDF を生成するためのリンクがあるとします。

<%= link_to 'Generate PDF', '/generate_pdf', :id=>'genpdf', :remote=>true %>

上記で作成した「genpdf」要素にイベントをバインドする必要があります。すなわち

$('#genpdf').bind('ajax:beforesend', disablepdf)
$('#genpdf').bind('ajax:complete', enablepdf)

次に、上記で宣言した 2 つの JavaScript 関数を定義して、必要に応じて HTML 要素を操作します。

  var disablepdf = function() { $("#genpdf").removeAttr("disabled") };
  var enablepdf = function() { $("#genpdf").attr("disabled", "disabled") };
于 2012-05-07T04:02:19.133 に答える