2016-06-20 3 views
1

사용자가 요청을 제출 한 후 백그라운드에서 처리해야합니다. 작업이 완료되면 사용자에게 작업이 완료되었다는 메시지를 보여주고 싶습니다.delayed_job 이후 자바 스크립트 렌더링

지금까지 나는이

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 

노동자 작업을 시작하고있다 끝내지 않았다. 너.

[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과 같은 서비스를 사용해야합니다.

이 작업은 자주 수행되며 사용자가 페이지를 다시로드하거나 페이지를 나갈 수있게 해주는 더 좋은 패턴 중 하나이며 완료가 아직 완료되지 않은 경우 여전히 사용 가능한 알림으로 돌아옵니다.

Possible example to check out

+0

미안하지만 나는 그것을 이해하지 못했습니다. 난 그냥 자바 스크립트를 렌더링하고 그래서 일부 타사 서비스 또는 도구가 필요합니다 생각하지 않습니다. – user464

+0

불행히도 지연된 작업 실행이 사용자 환경과 연결되어 있지 않아도 해당 사용자에게 직접 응답 할 수는 없습니다. 작업은 열린 세션과 사용자가 작업을 생성 한 것에 대해 아무 것도 모르기 때문에 직접 응답 할 수 없습니다. 가장 쉬운 방법은 백그라운드에서 처리중인 개체에 플래그를 지정하고 해당 플래그의 상태를 확인하도록 경로를 설정하는 것입니다. 그런 다음 플래그가 완료되었음을 나타내는 상태가 될 때까지 사용자 클라이언트가 5 초마다 해당 경로를 폴링하게합니다. 그런 다음 사용자에게 다시 응답 할 수 있습니다. –

관련 문제