【问题标题】:How to call handler methods in an initializer? creating webhooks如何在初始化程序中调用处理程序方法?创建 webhook
【发布时间】:2016-10-05 07:08:41
【问题描述】:

我想实时接收条纹网络挂钩,为此我必须使用初始化程序。使用 Stripe_events 宝石。我对初始化程序不太熟悉,但我是来学习的!

-我希望我的event(webhook) 被 handler_method 调用。

我的初始化器/stripe.rb

Rails.configuration.stripe = {
  :publishable_key => ENV['STRIPE_PUBLISHABLE_KEY'],
  :secret_key => ENV['STRIPE_SECRET_KEY']

}

Stripe.api_key = Rails.configuration.stripe[:secret_key]


StripeEvent.configure do |events|
    events.subscribe 'charge.succeeded', ReservationsController.new
    events.all = AllEvents.new



end

如您所见,我设置了 events.all = AllEvents.new
我想将所有事件都调用到这个 stripe_handler 中。基于 event.type 是什么 Ex.'charge.succeeded'

if event.type == 'charge.succeeded' 

etc........

end

在 app/stripe_handlers/all_events.rb 中

class AllEvents
  def call(event)

    if event.type == 'charge.succeeded'

        reservation = Reservation.find_by_transaction_id(event.object.id)
        reservation.update_attributes pay_completed: true

        # reservation = Reservation.find_by_transaction_id
    elsif event.type == 'customer.created'


    elsif event.type == 'account.application.deauthorized'

            # look out for account.updated and check if the account ID is unknown

  end
end
end

总而言之,我想将 events.all 值发送到 handler_methods,我可以在其中为每个 webhook 执行操作。

【问题讨论】:

  • hmm,当您说“handle_method 的所有值”时,您的意思是像处理各种事件的单个方法一样吗?如果是这样的话,那么我不明白是什么阻止你制作个人“handler_methods”。
  • 是的!像这样def call(event) 假设接收事件,然后在里面我使用事件值,这是刚刚作为 webhook 发送的特定事件

标签: ruby-on-rails ruby model controller event-handling


【解决方案1】:

我想把它放在 cmets 中,但它太大了,无法评论。在快速阅读文档here 之后,我将我对如何使用stripe_event gem 的理解写在下面。

所以,initializers/stripe.rb 你需要类似下面的代码块。您需要做的就是在配置块中调用events.subscribe,并使用事件名称和处理该事件的类的实例。您不需要只使用一个对象来处理所有事件。

StripeEvent.configure do |events|
    events.subscribe 'charge.succeeded', ChargeSucceeded.new
    event.subscribe 'customer.created', CustomerCreated.new
    event.subscribe 'account.application.deauthorized', Deauthorised.new
end

那么处理事件的类看起来像这样:

class ChargeSucceeded
  def call(event)
    #Code to handle event 'charge.succeeded'
  end
end

class CustomerCreated
  def call(event)
    #Code to handle event 'customer.created'
  end
end

class Deauthorised
  def call(event)
    #Code to handle event 'account.application.deauthorized'
  end
end

【讨论】:

  • 是的,这是我最初的想法,直到那里的支持方的一个人说将所有事件合二为一是个好主意,但你就是这样做的。您还为每个控制器创建单独的控制器吗?这么多控制器吗?或者我可以在一个控制器中有多个类吗?
  • @MichaelLombardo 抱歉,这些不是 Rails 控制器。这些只是普通的 ruby​​ 类,它们有一个方法 call 并以 event 作为参数。我已经编辑了我的答案,不使用控制器这个词,因为它有点令人困惑。所有控制器级别的处理都在 gem 中完成,并且 gem 只使用一个控制器,请参阅 here
  • 我收到一个错误 /Users/michael/Desktop/projects/ScribeOwl/config/initializers/stripe.rb:13:in `block in ': uninitialized constant ChargeSucceeded跨度>
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 2014-02-23
  • 2013-04-06
  • 2021-12-17
  • 2011-12-05
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多