1

時間がかかるキャリアウェーブ タスクに遅延ジョブを使用しています。

現時点では、成功へのフックを備えた単純なジョブを作成しました。次のようになります。

class VideoclipDownloadJob

  def initialize(video_id)
    @video_id = video_id
  end

  def perform
    Videoclip.grab_videoclips(@video_id)
  end

  def success(job)
    Rails.logger.info { "Videoclip downloads for video: #{@video_id} complete" }
    Video.find(@video_id).update_attribute(:videoclips_downloaded, Time.now)
  end

end

問題なく動作し、現在、ブラウザーに AJAX ポーリングを実装して、ジョブの完了とリダイレクトを確認しています。

ただし、このアプローチには 2 つの問題があるため、アドバイスをいただければ幸いです。

まず、現在ユーザーが JavaScript を持っていない場合、ジョブの完了後にユーザーをリダイレクトする方法がありません。

redirect_toしたがって、私は自分の仕事のサクセス フックにa を含めたいと考えています。これを成功せずに success(job) メソッドに直接追加し、モデルにそれを行うメソッドを作成しようとしました。

その時点で、これは良い MVC パターンとは思えないことに気付きました。

したがって、純粋にJavaScriptに依存する必要がありますか、それともより良い代替手段がありますか?

2 番目の質問は、Carrierwave の使用に関するものです。

ファイルの基本的な転送には問題なく機能していますが、ファイルが非常に大きくなる可能性があるため、ダウンロードと完了の 2 つの状態だけでなく、実際の転送の進行状況 (パーセンテージ) も表示できるようにしたいと考えています。移行。

クライアント側では、ジョブと同じ方法でこの情報をポーリングできます。

しかし、Carrierwave のドキュメントには、アップローダの特定の進行状況を確認する方法についての言及は見つかりません。

これら 2 つのことを達成するための最善の方法についてアドバイスをいただければ幸いです。

ありがとう、

クリス

4

1 に答える 1

2

redirect_to は、ブラウザ/js リクエストへの応答です。バックグラウンド ジョブをスケジュールし、JS が無効になっている場合、ユーザーのブラウザが新しいリクエストを作成していない場合、ユーザーをリダイレクトできません。また、彼のブラウザが新しいリクエストを行ったときに彼をリダイレクトすると、彼の作業を中断する可能性があるため、あまり良い考えではないかもしれません.

于 2012-05-21T05:12:39.217 に答える