2011-04-16 14 views
3

這是我第一篇文章,但我已經從這個網站獲得了一些很好的信息。所以我認爲有人可以提供幫助。如何在完成工作後更新部分

在我看來,我有一個表單,一旦提交,控制器將作業傳遞給navvy,它確實運行良好。問題是我想在navvy完成工作後,在新的信息表單的同一頁面上添加另一個部分。所以在我的控制,我有:

Navvy::Job.enqueue(GetZip, :get_zip, @series, :job_options => {:priority => 8}) 

然後在我的挖土塊,位於配置/初始化/ navvy.rb我:

class GetZip 
def self.get_zip(params) 
    fetch = Fetch.new 
    fetch.get_zip(params) 
# What to put here to update partial # 
end 
end 

預期其中一期工程。我只是不確定如何在挖掘作業完成後更新我的視圖中的部分內容。任何建議將不勝感激。

回答

4

這裏的問題是,一旦你啓動了後臺進程,你就不再被綁定到該用戶的請求中(這顯然是後臺進程的要點)。

因此,您的後臺工作並不知道用戶正在做什麼。例如,他們可以導航到另一個頁面,甚至離開您的網站。

您可以讓您的後臺作業在數據庫中創建一條記錄,指示它已經開始處理並在完成處理時更新此狀態。這樣,當用戶下一次刷新頁面時,您可以檢查該記錄的狀態,並且可以相應地更新該部分。

如果您希望頁面自動更新,您可以使用ajax請求繼續輪詢該記錄的狀態。在首次提交表單時,您可以開始輪詢,而不是始終運行。

+0

我想這是我必須要做的。雖然我認爲可能有另一種方式。我沒有提及這是一個單頁應用程序,只能在本地網絡上運行。 – fxe74 2011-04-18 01:42:22

0

這是我正在使用的。 這就是工作被稱爲:

Setting::progress = "Starting..." 
Navvy::Job.enqueue(EmailWorker, :async_email, stuff) 

設置超級簡單:

class Setting < ActiveRecord::Base 
    def Setting::progress=(value) 
    setn = Setting.find_or_initialize_by_name("email_status") 
    setn.value = value 
    setn.save 
    end 
end 

和壯工工作EmailWorker是:

class EmailWorker 
    def self.async_email(options) 
    # send one at a time 
    total = options[:list].length 
    errors = [] 
    options[:list].each_with_index do |email_addr, n| 
     begin 
     Setting::progress = "#{n+1}/#{total}: #{email_addr}" 
     Postoffice.one_notice(email_addr, options).deliver 
     rescue Exception => e 
     Setting::progress = "#{email_addr} #{e.message}" 
     errors << "<span class='red'>#{email_addr}</span> #{e.message}" 
     end  
     # get stack level too deep errors at random when this is removed. I don't get it. 
     sleep 0.05 
    end 
    Setting::progress = "DONE sending #{total} with #{errors.length} errors<br/>#{errors.join("<br/>")}" 
    "Done" # just for display in Navvy console output 
    end 
end 

然後觸發頁有這樣的:

<%- 
# had to add this back as rails 3 took it away 
    def periodically_call_remote(options = {}) 
    frequency = options[:frequency] || 10 # every ten seconds by default 
    code = "new PeriodicalExecuter(function() {#{remote_function(options)}}, #{frequency})" 
    javascript_tag(code) 
    end 
-%> 
<script type="text/javascript"> 
//<![CDATA[ 
    check_var = true; 
//]]> 
</script> 
<%= periodically_call_remote(
     :condition => "check_var == true", 
     :url => { :controller => "application", 
     :action => "update" }, 
     :frequency => '3') -%> 
<div id="progress"> 
    <p>Monitoring progress of emails</p> 
</div> 
多數民衆贊成一再呼籲10

而且繼承人的方法:它通過update.rjs警告有關挖土的

page.assign('check_var', @again) 
page.replace_html "progress", :partial => "info", :locals => { :info => @progress } 
page.visual_effect :highlight, 'progress', :startcolor => "#3333ff", :restorecolor => '#ffffff', :duration => 0.5 

一個詞trigers就地更新

def update 
    raise "not for direct" if (!request.xhr?) 
    @progress = Setting::progress 
    @again = !(/^DONE/ =~ @progress) 
    render :action => "update" 
end 

- 因爲它會作爲一個後臺任務,直到遇難,它會保持執行你的舊應用程序,當你部署。你必須在舊的「當前」中殺死挖土者,並轉移到新的「當前」。

+0

請你解釋一下我在哪裏找到update.rjs文件?資產/ javascripts? – 2012-03-02 08:40:20

相關問題