2015-04-23 60 views
0

我正在將Stripe與Devise集成。我想用條紋簽名用戶,並在用戶保存之前存儲條紋ID。該方法在API調用返回Customer散列之前完成。我怎樣才能解決這個問題?如何在驗證之前等待Stripe API調用返回

class User < ActiveRecord::Base 
    validates_presence_of :stripe_id 
    before_validation :create_stripe_customer 

    def create_stripe_customer 
     customer = Stripe::Customer.create(
      :email => email, 
      :card => stripe_card_token 
     ) 
     self.stripe_id = customer.id 
    end 
end 

當我檢查用戶時,stripe_id是零,驗證失敗。

回答

2

達到此目的的最佳方法是用Active Record Transaction用保護塊包裹它。

事務是保護性塊,SQL語句只有在它們都可以作爲一個原子動作成功時才​​是永久性的。

begin 
    @user = User.new(strong_params) 

    User.transaction do 
    @user.save! 

    customer = Stripe::Customer.create(
       :email => email, 
       :card => stripe_card_token 
      ) 

    @user.update_attributes!(stripe_id: customer.id) 
    end 
rescue Exception => ex 
    flash[:danger] = "#{ex}" 
    render 'new' 
end 

這將強制執行該語句將被一起或根本沒有執行。