5

我已經看了Stripe documentation on errors,但我仍然有一些問題處理/重定向這些錯誤正確。基本上不管發生什麼事情,我希望他們回到edit行動(通過edit_profile_path)並向他們顯示消息(無論是否成功)。正確處理Stripe錯誤和異常與紅寶石的一次性收費

我對edit操作發佈了update操作的表單。這可以使用有效的信用卡正常運行(收費在條形儀表板中)。我正在使用Stripe.js。

class ExtrasController < ApplicationController 

    def edit 
    @extras = current_user.extras 
    end 

    def update 

    Stripe.api_key = "hidden" 

    token = params[:stripeToken] 

    begin 
     charge = Stripe::Charge.create(
     :amount => 5000, # amount in cents 
     :currency => "usd", 
     :card => token, 
     :description => current_user.email 
    ) 
    rescue Stripe::CardError => e 
     # redirect_to edit_extras_path, notice: e.message 
     # What I'm trying to do, but obviously results in AbstractController::DoubleRenderError 
    rescue => e 
     # Something else happened, completely unrelated to Stripe 
     # Display a generic error message 
    end 

    redirect_to edit_extras_path, notice: "Card charged successfully." 
    end 

end 
+1

我建議您在獲得機會時將此邏輯移至模型。 – tommyd456

+0

自發布以來,我已經這樣做了。謝謝你的建議。 – gbdev

+0

好人 - 我實際上把我的感動轉移到了一個專門的服務對象上,因爲我覺得它不適合任何模型。 – tommyd456

回答

10

雖然你現在可以通過閃光消息redirect_to,也可以仍然本身操縱閃光燈。

所以你更新代碼的微小變化可以讓你做你想要什麼:

def update 

    Stripe.api_key = "hidden" 

    token = params[:stripeToken] 

    begin 
    charge = Stripe::Charge.create(
     :amount => 5000, # amount in cents 
     :currency => "usd", 
     :card => token, 
     :description => current_user.email 
    ) 
    # No exceptions were raised; Set our success message. 
    flash[:notice] = 'Card charged successfully.' 
    rescue Stripe::CardError => e 
    # CardError; display an error message. 
    flash[:notice] = 'That card is presently on fire!' 
    rescue => e 
    # Some other error; display an error message. 
    flash[:notice] = 'Some error occurred.' 
    end 

    redirect_to edit_extras_path 
end 

使您的郵件在他們的目的更加明確,你可能想換出的錯誤狀態noticealert或者閃存類型爲error;您可以輕鬆地使用CSS來設計它們的樣式,以便一目瞭然地指示成功或失敗。 (例如,BootstrapFoundation,每個提供顯示各種警報的樣式)。

+0

我正在調查這種方式顯然太多了哈哈。感謝您的簡單解決方案。是的,我用'alert'和''notice'閃爍來做到這一點。乾杯! – gbdev

+0

忽略簡單的東西總是容易的!很高興幫助。 – colinm