Ruby on rails Rails:从后台工作者访问属性(Stripe charge\u id)
我设法获得了条带工作和处理作业,用户必须支付一次性费用才能创建作业记录 在后台作业中调用Ruby on rails Rails:从后台工作者访问属性(Stripe charge\u id),ruby-on-rails,stripe-payments,Ruby On Rails,Stripe Payments,我设法获得了条带工作和处理作业,用户必须支付一次性费用才能创建作业记录 在后台作业中调用Stripe::Charge.create后,我无法想出如何将Charge.id从Stripe::Charge.create传递到订单对象 我计划将Order.create调用移动到sidekiq worker中,并直接访问charge.id,但我无法访问worker中的@job,因为stripeToken不能多次使用。你知道我如何将费用.id保存到订单中吗?(与主工作模型分开) 作业控制器 def crea
Stripe::Charge.create
后,我无法想出如何将Charge.id
从Stripe::Charge.create
传递到订单对象
我计划将Order.create调用移动到sidekiq worker中,并直接访问charge.id
,但我无法访问worker中的@job,因为stripeToken不能多次使用。你知道我如何将费用.id
保存到订单中吗?(与主工作模型分开)
作业控制器
def create
...
if @job.create_with_stripe(params[:stripeToken])
if @job.save
Order.create(
# Can't figure out how to pass the charge.id from StripePaymentJob
:charge_id => @charge.id,
:job_id => @job.id
)
end
...
end
class StripePaymentJob < ApplicationJob
queue_as :default
def perform(token, idempotent_key)
@charge = Stripe::Charge.create({
...
}, { idempotency_key: idempotent_key })
end
end
工作模式
def create_with_stripe(token)
Stripe.api_key = Rails.application.secrets.stripe_secret_key
if valid?
StripePaymentJob.perform_later(token, SecureRandom.uuid)
else
...
end
条带工人
def create
...
if @job.create_with_stripe(params[:stripeToken])
if @job.save
Order.create(
# Can't figure out how to pass the charge.id from StripePaymentJob
:charge_id => @charge.id,
:job_id => @job.id
)
end
...
end
class StripePaymentJob < ApplicationJob
queue_as :default
def perform(token, idempotent_key)
@charge = Stripe::Charge.create({
...
}, { idempotency_key: idempotent_key })
end
end
class StripePaymentJob >P>我会考虑这种方法:
- 在请求执行作业之前,请使用零费用id创建订单记录
- 在作业中完成条带事务后,使用返回的费用id更新订单
要做到这一点,您可以依赖globalid,它允许您的作业直接访问订单。有关信息,请参阅
更新作业实现,以便在作业成功完成后立即更新对象:
class StripePaymentJob < ApplicationJob
queue_as :default
def perform(token, idempotent_key, order)
@charge = Stripe::Charge.create({
...
}, { idempotency_key: idempotent_key })
order.update(charge_id: @charge.id, job_id: self.jid)
end
end
请让我知道这是否可行,或者如果我需要更新这个答案。 < P>我会考虑这个方法:
- 在请求执行作业之前,请使用零费用id创建订单记录
- 在作业中完成条带事务后,使用返回的费用id更新订单
要做到这一点,您可以依赖globalid,它允许您的作业直接访问订单。有关信息,请参阅
更新作业实现,以便在作业成功完成后立即更新对象:
class StripePaymentJob < ApplicationJob
queue_as :default
def perform(token, idempotent_key, order)
@charge = Stripe::Charge.create({
...
}, { idempotency_key: idempotent_key })
order.update(charge_id: @charge.id, job_id: self.jid)
end
end
让我知道这是否有效,或者我是否需要更新此答案。出于安全原因删除了一些代码在调用create\u with_stripe
之前扫描是否保存作业?Sidekiq pro我认为支持回调,但如果不为此付费,我认为您需要重新安排如何保存这些东西。如果可以先保存作业,则可以将作业id传递给工人,然后在工人中创建订单。@Jon啊,对了。我的问题是,我只想在调用Stripe之后保存作业。事实上,我猜用户希望在某个时候收取费用。没有理由我不能保存工作,然后处理费用。关于如何存储费用id,您还有其他想法吗?我觉得必须检索过去的费用是相关的。出于安全原因删除了一些代码在调用create\u with_stripe
之前扫描保存作业?Sidekiq pro我认为支持回调,但如果不为此付费,我认为您需要重新安排如何保存这些东西。如果可以先保存作业,则可以将作业id传递给工人,然后在工人中创建订单。@Jon啊,对了。我的问题是,我只想在调用Stripe之后保存作业。事实上,我猜用户希望在某个时候收取费用。没有理由我不能保存工作,然后处理费用。关于如何存储费用id,您还有其他想法吗?我觉得有必要检索过去的费用。感谢@Phil的回复……我将在晚上检查并回信。我更喜欢传递ID,而不是传递整个对象,ActiveJob
Globalid库在幕后对ActiveRecord实例进行序列化/反序列化。ActiveJob在尝试反序列化参数时出错,因为我在正在传递的对象上有一个“UrlValidator”。感谢@Phil…的响应。我将在晚上检查并回信。我更喜欢传递ID,而不是传递整个对象,ActiveJob
Globalid库在幕后为序列化/反序列化ActiveRecord实例。ActiveJob在尝试反序列化参数时出错,因为我在传递的对象上有一个“UrlValidator”。