0

我刚刚开始使用 Stripe,并按照他们的指南设置使用 Rails 结帐

就我而言,我让用户能够升级事件列表。

在我的事件模型中,我有一个 make_premium 方法:

  def make_premium
    self.update_attribute(:premium_event, true)
  end 

我的 event_controller 的升级操作基于 Stripe 的创建示例,除了我添加了一个 repond_to 块以将用户带回他们升级的事件并调用 make_premium 方法。

  def upgrade
    @event = Event.find_by_slug(params[:id])
    # Amount in pence
    @amount = 299

    customer = Stripe::Customer.create(
      :email => current_user.email,
      :card  => params[:stripeToken]
    )

    charge = Stripe::Charge.create(
      :customer    => customer.id,
      :amount      => @amount,
      :description => 'Premium Event Upgrade',
      :currency    => 'gbp',
      :metadata => {'event_id' => @event.id, 'event_headline' => @event.headline}
    )

    respond_to do |format|
       format.html { redirect_to @event, :notice => 'Event was successfully upgraded.' }
       @event.make_premium
    end

    rescue Stripe::CardError => e
      flash[:error] = e.message
      redirect_to event_path(@event)
  end

我想知道的是,a) 考虑到之后的救援,在这里可以使用对块的响应吗?b) 可以从这个块中调用我的 make_premium 方法吗?

我已经尝试过使用 Stripe 的 webhook,虽然 charge.suceeded 钩子运行良好,但如果上述方法足够,我可以避免额外的步骤。

任何对 Stripe 更有经验的人的见解将不胜感激。

4

1 回答 1

1

我几乎肯定你可以rescue在方法中的任何地方都有一个块,如果发生异常,它将被调用。

我建议的唯一潜在更改是添加检查以确保属性已成功更新。

def upgrade
    @event = Event.find_by_slug(params[:id])
    # Amount in pence
    @amount = 299

    customer = Stripe::Customer.create(
      :email => current_user.email,
      :card  => params[:stripeToken]
    )

    charge = Stripe::Charge.create(
      :customer    => customer.id,
      :amount      => @amount,
      :description => 'Premium Event Upgrade',
      :currency    => 'gbp',
      :metadata => {'event_id' => @event.id, 'event_headline' => @event.headline}
    )

    respond_to do |format|
       if @event.make_premium
         format.html { redirect_to @event, :notice => 'Event was successfully upgraded.' }
       else
         // handle error and redirect
       end
    end

    rescue Stripe::CardError => e
      flash[:error] = e.message
      redirect_to event_path(@event)
  end
于 2013-11-13T15:42:13.707 回答