0

我正在尝试复制 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
4

2 回答 2

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
于 2012-08-28T06:00:44.687 回答
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应该收到两个ids。您现在发送的一个,另一个是TaskRequestid。因此,在从服务中获取数据后,它将存储在TaskRequest表中并将更新is_recievetrue. 将其设置为 true 最终将不再请求此数据。

好吧,整个解释可能看起来有点模糊。如果您没有任何零件或您需要其他任何东西,请告诉我。

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

于 2012-08-28T05:27:09.940 回答