2012-03-24 33 views
0

我正在寫一個在出租車中的iPad上運行的Web應用程序。現在我希望每個設備每X分鐘致電服務器並說「我還活着」。Rails:僅使用javascript更新某個字段

出於這個原因,我有一個「latest_activity」字段,我想用Rails的Time.now

什麼是做到這一點的最好的方法來更新?我正在考慮發送一個GET到「/ app?update_id = 52」,然後rails會查找參數[:update_id]並更新字段,但這感覺很髒,我認爲必須有更好的方法來做這個。

更新與解決方案如下

回答

0

我會PUT在控制器的update行動無論有latest_activity領域。所以說,現場是Client,我會使用RESTful風格的路線,像這樣:

# routes.rb 
resources :clients 

然後使用端點:

PUT /clients/52 

當然然後ClientsController得到一個update方法,將字段設置到你已經提到的Time.now

Backbone本地/輕鬆地支持這種類型的URL方案。您對前端一Client模型,你只需要做:

someClient.set({ latest_activity: new Date() }); 
someClient.save(); 

雖然那樣的對我說,你可能只是讓前端產生的時間戳,而不是在軌道做..否則,你真的只是發送一個虛假的價值(真實的日期,不會被使用或只是,例如,1,然後'通知'在後端)。如果你發送一個真正的時間戳,你可以這樣做:

# app/controllers/clients_controller.rb 
def update 
    c = Client.find(params[:id]) 
    c.latest_activity = params[:latest_activity] 
    c.save 
    render :json => { :ok => true } 
end 

或沿着這些線。

+0

感謝您的答案,但與發送客戶端生成的時間戳的問題是,客戶端可能有不同的t imezone。這就是爲什麼我想生成時間戳服務器端。如果您想查看,我已經發布了我的解決方案。 – 2012-03-25 15:07:44

0

解決方案

我已經採取了略微不同的路徑。現在,我已經添加了方法我devices_controller

def ping 
    if params[:id] 
    @device = Device.find(params[:id]) 
    @device.latest_activity = Time.now 
    @device.save() 
    end 
    respond_with(@device) 
end 

,並增加了成員的設備資源,像這樣

resources :devices do 
    # Device Ping ('/api/v1/devices/#{id}/ping') 
    put 'ping', :on => :member 
end 

現在我只是發送PUT請求/ API/V1 /設備/身份證/平,從我的情況Backbone.js像這樣

ping: -> 
    if localStorage.device_id? 
    setInterval => 
     $.ajax 
     type: "PUT" 
     url: "/api/v1/devices/#{localStorage.device_id}/ping" 
    , 1000 * 60 * 15 # every 15 Minutes 
相關問題