我正在尝试复制Ryan Bates在Resque的railscast中设置的设置,在那里他排队第三方服务Web请求,然后用结果更新他的结果页面。
我正在设计一个应用程序,它将与另一个Rails应用程序进行交互, 而不是浏览器 ,并希望复制类似行为,关键区别在于仅预期JSON输出
目前我有这样的事情:(我的模型是Lists
和Tasks
,列表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
答案 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在回答问题时显示代码格式的方式;)