2016-06-20 5 views
1

ユーザーがリクエストを送信した後、バックグラウンドで何らかの処理を行う必要があります。仕事が終わった後、私はあなたの仕事が完了したことをユーザーに伝えたい。delayed_jobの後にjavascriptをレンダリングする

これまでのところ、私はこの

のlib /ジョブ/ custom_job.rbに

class CustomJob 

    def perform 
    sleep 1 # Here will do the background processing. 
    ActionView::Base.new('app/views', {}, ActionController::Base.new).render(file: 'teacher/courses/custom') 
    end 
end 

custom.js

$(document).ready(function() { 
    alert("Your job is done."); 
}); 

を持つコントローラ

class Teacher::CoursesController < ApplicationController 

    def index 
    Delayed::Job.enqueue(CustomJob.new) 
    @courses = current_teacher.courses.all 
    end 
end 

ワーカージョブを開始し、それを終わらせなかったror。

[Worker(host:Aragorn pid:3360)] Job CustomJob (id=16) COMPLETED after 1.0635 
[Worker(host:Aragorn pid:3360)] 1 jobs processed at 0.9035 j/s, 0 failed 

ありがとうございます。

答えて

0

フロントエンドにポーリングインターフェースを用意して、バックエンドのオブジェクトの完全なイベントを探したり、pusher.comのようなサービスを利用する必要があります。

これは頻繁に行います。これは、ユーザーがページを再読み込み/離脱し、まだ完了していない場合でも、まだ利用可能な通知に戻ることができる、われわれが見つけたより良いパターンの1つです。

Possible example to check out

+0

申し訳ありませんが、わかりません。私はちょうどjavascriptをレンダリングしたいと思うので、サードパーティのサービスやツールが必要になるとは思わない。 – user464

+0

残念ながら、遅延されたジョブの実行がユーザーエクスペリエンスから切断されても、そのユーザーに直接応答することはできません。ジョブは開いているセッションとユーザーがジョブを生成したことについて何も知らないので、ユーザーはジョブに直接応答することはできません。 最も簡単な方法は、処理中のオブジェクトにバックグラウンドでフラグを設定し、そのフラグの状態を確認するようにルートを設定することです。その後、フラグが完了したことを示す状態になるまで、ユーザーのクライアントに5秒ごとにそのルートをポーリングします。その後、ユーザーに返信することができます。 –

関連する問題