5

Ho esaminato lo Stripe documentation on errors, ma sto ancora riscontrando problemi nella gestione/reindirizzamento di questi errori in modo corretto. Fondamentalmente, non importa cosa succede, voglio che tornino all'azione edit (tramite edit_profile_path) e visualizzino loro un messaggio (che sia riuscito o meno).Utilizzo corretto Errori e eccezioni stripe con Ruby per addebito una tantum

Ho un modulo sull'azione edit che POST per l'azione update. Funziona correttamente con una carta di credito valida (l'addebito è nel dashboard Stripe). Sto usando 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

Si consiglia di spostare questa logica su un modello quando si ha la possibilità. – tommyd456

+0

L'ho fatto da quando ho postato questo. Grazie comunque per la raccomandazione. – gbdev

+0

Good man: in realtà ho spostato il mio su un oggetto di servizio dedicato perché ritenevo che non si adattasse a nessun modello. – tommyd456

risposta

10

Anche se è ora possibile passare un messaggio flash per redirect_to, è anche possibile ancora di manipolare il flash di per sé.

Così una piccola modifica al codice di aggiornamento ti permette di fare ciò che si vuole:

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 

per rendere i vostri messaggi più chiaro nel loro scopo, si potrebbe desiderare di scambiare notice negli stati di errore per un alert o tipo di flash error; puoi quindi facilmente modificarli con i CSS per indicare il successo o il fallimento a prima vista. (Bootstrap e Foundation, ad esempio, ciascuno fornisce stili per la visualizzazione di avvisi di vario tipo.)

+0

Stavo osservando in questo modo troppo apparentemente haha. Grazie per la soluzione semplice. E sì, ho fatto esattamente questo con i lampeggi 'alert' vs' notice'. Saluti! – gbdev

+0

È sempre facile trascurare le cose semplici! Sono contento che ci abbia aiutato. – colinm