2016-06-19 11 views
0

私は、トランザクションの現在のブレーンツリーステータスが "submitted_for_settlement"または "authorized"のいずれかであるかどうかを確認するためのコントローラアクションを持っています。voidトランザクションはステータスが "決済された "払い戻し取引。どういうわけか、コントローラはすべてのトランザクションを無効にして、私が望むように動作していません。ここに私のコードのサンプルです:レールの条件付きロジックが動作しない

@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 

私はしかし、「彼らは、許可またはsubmitted_for_settlementされた場合の取引にのみ無効することができます」と言い決済される取引上のエラーを取得していますが、許可と和解のために提出されているすべてのトランザクション正しく発射されています。

さらに問題があるのは、エラーが発生してもブレーントリー決済されたトランザクションが変更されていなくても、コントローラがデータベース内のステータスを無効にすることです。

なぜこのエラーが発生しますか?

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

答えて

1

変更ライン

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

==||@transaction.status == "authorized" || "submitted_for_settlement"(@transaction.status == "authorized") || "submitted_for_settlement"と等価であるよりも高い優先度を有するからです。したがって、ステータスが「承認済み」の場合、この式はtrueを返します。それ以外の場合は、文字列"submitted_for_settlement"を返します。これはRubyでも真実とみなされます。

私はBraintree::Transactionにいくつかのメソッドを定義することをお勧めしたい:あなたのコントローラで次に

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

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

私はそれを試してみましたが、今で未定義のメソッド取得しています「の成功を?」 nilの場合:NilClassエラー – simon

+0

'void'または 'refund'の戻り値は何ですか? '@ transaction'が承認されていない場合、submit_for_settlementまたは決済された場合はどうなりますか? – Aetherus

+0

私はtransaction.statusを確認しました。braintreeが返信して、それが "解決済み"として表示されています。それはロジックによって引き起こされるレールエラーです。 API呼び出しが決して行われず、決して送信されなかった結果をチェックしているので、エラーが表示されます。ステータスが承認されたもの、submit_for_settlement以外のものであれば、ここに表示されます:redirect_to orders_path、alert: "トランザクションをキャンセルできませんでした:#{@result.transaction.processor_response_code} text:#{@@result.transaction.processor_response_text} "n – simon

関連する問題