0

Ich habe eine Controller-Aktion in Schienen, die überprüfen soll, ob der aktuelle Braintree-Status einer Transaktion entweder "submitted_for_settlement" oder "authorized" und dann void die Transaktion ist, aber wenn der Status ist " abgerechnet "dann Rückerstattung die Transaktion. Irgendwie löscht der Controller alle Transaktionen und funktioniert nicht so, wie ich es möchte. Hier ist ein Beispiel von meinem Code:Rails Conditional Logic funktioniert nicht

@transaction = Braintree::Transaction.find(@id) 
if @transaction.status == "authorized" || "submitted_for_settlement" 
    @result = Braintree::Transaction.void(@id)  
elsif @transaction.status == "settled" 
    @result = Braintree::Transaction.refund(@id)    
end 


if @result.success? 
@order.update(status: "voided") 
redirect_to orders_path, notice: "transaction successfully voided " 
elsif @result.transaction 

redirect_to orders_path, alert: "transaction could not be cancelled code: #{@result.transaction.processor_response_code} text: #{@result.transaction.processor_response_text}" 

else 
     errors = @result.errors.map { |error| "Error: #{error.code}: #{error.message}" } 
     flash[:error] = errors 
     redirect_to orders 


end 

Ich erhalte einen Fehler auf Transaktionen, die abgewickelt werden, der sagt „Transaktionen können nur für ungültig erklärt werden, wenn sie berechtigt sind oder submitted_for_settlement“ aber alle Transaktionen, die berechtigt sind, und für die Abrechnung eingereicht feuern richtig ab.

Was noch beunruhigender ist, ist der Controller wird den Status in der Datenbank ungültig machen, auch wenn ich den Fehler bekomme und die Braintree Settlement-Transaktionen unverändert bleiben.

Warum erhalte ich diesen Fehler?

Antwort

1

die Leitungswechsel

if @transaction.status == "authorized" || "submitted_for_settlement" 

zu

@transaction.status == "authorized" || @transaction.status == "submitted_for_settlement" 

Da == höhere Priorität hat als || ist @transaction.status == "authorized" || "submitted_for_settlement" entspricht (@transaction.status == "authorized") || "submitted_for_settlement". Wenn der Status "autorisiert" ist, gibt dieser Ausdruck true zurück, andernfalls gibt er die Zeichenfolge "submitted_for_settlement" zurück, die in Ruby auch als truthy gilt.

Ich würde vorschlagen, einige Methoden zum Braintree::Transaction zu definieren: „Erfolg“

class Braintree::Transaction 
    %w(authorized submitted_for_settlement settled).each do |status| 
    define_method("#{status}?") do 
     self.status == status 
    end 
    end 
end 

Dann in Ihrem Controller

if @transaction.authorized? || @transaction.submitted_for_settlement? 
    # ... 
elsif @transaction.settled? 
    # ... 
end 
+0

ich es ausprobiert und nun eine nicht definierte Methode ist immer für nil: NilClass Fehler – simon

+0

Was ist dann der Rückgabewert von 'void' oder' refunds'? Was ist, wenn '@ transaction' nicht autorisiert, submission_for_settlement oder abgewickelt wurde? – Aetherus

+0

Ich überprüfte die Transaktion. Status braintree sendet zurück und es erscheint als "settled". Das ist ein Schienenfehler, der durch die Logik verursacht wird. Ich bekomme den Fehler, weil der api-Aufruf nie gemacht wird und ich nach einem Ergebnis suche, das nie gesendet wurde. Wenn der Status etwas anderes als authorized, submitted_for_settlement oder settled ist, wird er hier angezeigt: redirect_to orders_path, alert: "Die Transaktion konnte nicht abgebrochen werden code: #{@result.transaction.processor_response_code} text: #{@result.transaction.processor_response_text} "n – simon