0

時間がかかるアクションがあります。ユーザーが接続を失ったか何かについて混乱しないように、プロセス中に更新を提供できるようにしたいと思います。私はこのようなことをすることができますか?

class HeavyLiftingController < ApplicationController
  def data_mine
    render_update :js=>"alert('Just starting!')"
    # do some complicated find etc.
    render_update :js=>"alert('Found the records!')"
    # do some processing ...
    render_update :js=>"alert('Done processig')"
    # send @results to view
  end
end
4

2 に答える 2

2

いいえ、コントローラーアクション内で発行できるレンダリングは1つだけです。コントローラが終了するまで、レンダリングは何も行いません。data_mineが終了すると、3つのレンダリングが行われ、エラーが発生します。

アップデート:

ブラウザでJavaScript(jquery)タイマーを設定してから、定期的にAJAXリクエストをサーバーに送信して、長時間実行されているタスクの現在のステータスを確認する必要があります。

たとえば、長時間実行されるタスクは進行中にログを書き込むことができ、定期的なAJAXリクエストはそのログを読み取り、ある種のステータス表示を作成し、それをブラウザに返して表示します。

于 2012-10-19T16:58:32.230 に答える
0

そのようにリクエストを処理することは不可能です。リクエストごとに、答えは1つだけです。

アクションに時間がかかる場合は、非同期で実行する必要があります。プロセス中にユーザーに電子メールを送信して、進行状況を通知することができます。

DelayedJob gemをご覧になることをお勧めします:http: //rubygems.org/gems/delayed_job

それはあなたのために非同期のものを扱うことの最も難しい部分を処理します(あなたのオブジェクト、ストレージなどをシリアル化/逆シリアル化する...)。

お役に立てば幸いです。

于 2012-10-19T19:10:46.117 に答える