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”。