2012-08-28 34 views
0

我試圖複製Ryan Bates在Resque上的這個railscast中的設置,他在那裏排隊第三方服務Web請求,然後用結果更新他的結果頁面。用Resque延遲render_to

我設計將與其他Rails應用程序交互的應用,不是瀏覽器,並想複製類似的行爲,與主要的差別在於只JSON產量預計

目前我有這樣的事情。(我的模型ListsTasks,列表has_many任務和任務belongs_to列表

lists_controller.rb

def show 
    Resque.enqueue(TaskDataFetcher,params[:id]) 
    # confused if I need to have a render_to below this. 

end 

task_data_fetcher.rb

require "net/http" 
require "uri" 

    class TaskDataFetcher 
    @queue = :tasks_queue 

    def self.perform(id) 

     list = List.new(:id => id) 
     url = "taskservice.com/" + id + ".json" 

     uri = URI.parse(url) 
     response = Net::HTTP.get_response(uri) 
     task = Task.new(:contents => response.body) 
     task.list = list 
     # how to return this to the requesting server???? 
    end 
    end 

回答

1

在Railscast你看到的結果並不在Resque任務完成後自動更新,他要重新加載頁面幾次,重新制作show請求。所以,如果你想複製這種行爲,你可以這樣做:

def show 
    list = List.find(params[:id]) 
    if list 
     respond_to do |format| 
      format.json {render :json => list.to_json} 
     end 
    else 
     Resque.enqueue(TaskDataFetcher, params[:id]) 
     render :nothing => true, :status => 202 
    end 
end 
0

Requerement: 所以你的用戶請求服務,看到一些任務。你必須從另一個服務taskservice.com獲取這些。然後我認爲你必須通過數據庫來實現持久性。

建議: 你可以有一個模型就像TaskRequest其屬性

`id` # must ;) 
`task_list` # might be xml or whatever format suits you best 
`is_received` # boolean 

在你show方法, 您創建了一個TaskRequest錄入和渲染視圖,它會顯示一個loading類型的事情,並會通過ajax請求任務。 ajax響應應該返回任務列表和is_received。但是,一旦您獲得is_received對於您應該再次請求的內容爲真。

同時,您的TaskDataFetcher應該會收到兩個id s。一個你現在正在發送的另一個是TaskRequest id。因此,在從服務中獲取數據後,它會將其存儲在TaskRequest表中,並將is_recieve更新爲true。將其設置爲true將最終關閉請求這些數據了。

好吧,整個解釋看起來有點朦朧。只要告訴我,如果你沒有任何部分,或者你需要任何其他的東西。

注:這多少有點像的方式,使顯示的代碼,而回答問題的格式;)

+0

感謝您的回答,正如我所說,這並不與瀏覽器進行交互(所以沒有AJAX必然的,除非請求服務器運行JS),做這將我需要一個websockets連接? –