2012-08-28 35 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连接? –