使用Rescue延迟render_to

时间:2012-08-28 02:28:04

标签: ruby-on-rails ruby-on-rails-3 resque

我正在尝试复制Ryan Bates在Resque的railscast中设置的设置,在那里他排队第三方服务Web请求,然后用结果更新他的结果页面。

我正在设计一个应用程序,它将与另一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。您现在发送的另一个是TaskRequest ID。因此,从服务中获取数据后,它会将其存储在TaskRequest表中,并将is_recieve更新为true。将其设置为true将最终关闭请求此数据。

好吧,整个解释可能看起来有点朦胧。如果你没有任何部分,或者你需要其他任何具体的东西,请告诉我。

注意:这就像SO在回答问题时显示代码格式的方式;)