【发布时间】:2015-01-30 04:53:35
【问题描述】:
在我的 Rails 应用程序中,我试图接受我的工作 API 调用,并让后台工作人员处理它们。
我在 app/jobs/api_request_job.rb 中有以下内容:
class ApiRequestJob
def self.perform(params)
Query.new(params).start
end
end
Query 类是执行 HTTParty 请求的地方(对于不同的查询类型有很多方法,其基本格式与 parks 方法相同:
require 'ostruct'
class Query
include FourSquare
attr_reader :results,
:first_address,
:second_address,
:queries,
:radius
def initialize(params)
@results = OpenStruct.new
@queries = params["query"]
@first_address = params["first_address"]
@second_address = params["second_address"]
@radius = params["radius"].to_f
end
def start
queries.keys.each do |query|
results[query] = self.send(query)
end
results
end
def parks
category_id = "4bf58dd8d48988d163941735"
first_address_results = FourSquare.send_request(@first_address, radius_to_meters, category_id)["response"]["venues"]
second_address_results = FourSquare.send_request(@second_address, radius_to_meters, category_id)["response"]["venues"]
response = [first_address_results, second_address_results]
end
最后是控制器。在尝试将此操作分配给后台工作人员之前,这条线路运行良好:@results = Query.new(params).start
class ComparisonsController < ApplicationController
attr_reader :first_address, :second_address
def new
end
def show
@first_address = Address.new(params["first_address"])
@second_address = Address.new(params["second_address"])
if @first_address.invalid?
flash[:notice] = @first_address.errors.full_messages
redirect_to :back
elsif Query.new(params).queries.nil?
flash[:notice] = "You must choose at least one criteria for your comparison."
redirect_to comparisons_new_path(request.params)
else
@queries = params["query"].keys
@results = Resque.enqueue(ApiRequestJob, params) # <-- this is where I'm stuck
end
end
end
我正在运行 redis,安装了 resque,并且正在运行任务/启动工作人员。为@results 返回的当前值是true,而不是我需要返回的结果哈希。有没有办法让 Resque 作业的结果持久化并返回数据而不是 true?关于如何让后台工作人员返回与我的常规 api 调用返回的相同类型的数据,我缺少什么?
非常感谢!
【问题讨论】:
-
您好,您的问题解决了吗?
标签: ruby-on-rails redis backgroundworker resque