我在rails中有一个控制器操作,用于检查事务的当前braintree状态是否为" submitted_for_settlement"或"授权"然后无效交易,但如果状态是"已解决"然后退款交易。不知何故,控制器排除所有交易,而不是像我想要的那样工作。以下是我的代码示例:
@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
我收到错误的交易已解决,说"交易只有在获得授权或提交后才能无效。但所有经过授权和提交结算的交易都是正确的。
更令人不安的是,即使我收到错误并且braintree结算的交易保持不变,控制器也会使数据库中的状态无效。
为什么我会收到此错误?
答案 0 :(得分:1)
更改行
if @transaction.status == "authorized" || "submitted_for_settlement"
到
@transaction.status == "authorized" || @transaction.status == "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