2012-01-27 81 views
1

我有一個Rails 3應用程序,它使用resque運行長在後臺運行的作業,我希望到另一個頁面刷新使用jQuery div元素中的Rails 3應用程序

上創建一個視圖的結果目前我有這種情況下工作

Resque運行一項工作,並將信息寫入數據庫(更新信息條目)。一旦工作完成它更新數據庫條目中的一個,即它設置完整= 1

DB模式是

create_table "refreshes", :force => true do |t| 
    t.string "name" 
    t.string "info" 
    t.integer "complete" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

在該應用中的另一頁面視圖將顯示(完成與0值創建)數據庫條目通過調用控制器並在頁面上顯示最新數據,如果數據庫中的完整值不等於1,則此視圖具有插入標準JavaScript刷新元素的邏輯片段。

view.html。 erb

<% if @refreshes.complete == 0 %> 
<meta http-equiv='refresh' content='5'> 
<%end%> 

<div id="data"> 
<p> 
    <b>Name:</b> 
    <%= @refreshes.name %> 
</p> 
<p> 
    <b>Info:</b> 
    <%= @refreshes.info %> 
</p> 
</div> 

控制方法

def view 
    @refreshes = Refresh..find(params[:id]) 

    respond_to do |format| 
     format.html # view.html.erb 
     format.xml { render :xml => @refreshes } 
    end 
end 

這一切工作正常,但它完成時被設置爲0做一個完整的頁面重載每5秒鐘,我想要做的只是刷新顯示數據的DIV什麼(div id = data)而不刷新整個頁面。

我認爲這可以使用jQuery和一些JavaScript來完成,但我找不到一種方法來做到這一點,任何人都可以幫忙嗎?或者即使你可以點我的方向我將不勝感激 乾杯 邁克

回答

2

是的,這可以使用JavaScript來完成。一種方法是

  1. 要每n分鐘刷新一次div,可以使用setInterval方法每n毫秒調用一次函數。
  2. 該函數應該發出一個Ajax請求,從服務器獲取數據並將數據插入到HTML中。

下面的代碼使用jQuery,但您可以使用任何其他庫來獲取結果。

$(document).ready(function() { 
     // get data every 5 mins and refresh myDiv 
     var pingAfter = 5000; 
     var refreshId = setInterval(function() { 
      $("#myDiv").load('/partial/data'); 
     }, pingAfter); 
    }); 

brightcherry.co.uk網站有一個示例代碼來實現相同。

+0

謝謝你們,將在週末嘗試這兩個 – user891380 2012-01-27 19:52:50

+0

接受答案,如果它幫助你解決了這個問題。 – Yogesh 2012-02-06 07:08:10

1

使用jQuery你可以做一個Ajax調用,可以一次又一次地使用定時器

被稱爲的application.js 調用此在按鈕的點擊功能或backgroung當作業開始

updateDiv = function(){ 
$.ajax{ 
url:'/controller/view.js?paramid='+id+'so..on='+so..on, 
method:get, 
success:function(){ 
    if (data.complete==1){ 
    //stop this 
    }else{ 
    setInterval(updateDiv,5000); 
    } 
} 

內部控制器:::

def view 
//logic to find param 
render do|f| 
    f.html 
    f.js 
end 
end 

view.js.erb

#create a partial that can be rendered inside div 'data' 
$('#data').render(<% partial %>); 
or 
$('#data').html();