【问题标题】:Rails conditional logic not workingRails条件逻辑不起作用
【发布时间】:2016-06-19 22:34:05
【问题描述】:

我在 Rails 中有一个控制器操作,它应该检查交易的当前 Braintree 状态是“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

我在已结算的交易上收到一条错误消息,上面写着“交易只有在获得授权或提交_for_settlement 的情况下才能作废”,但所有已授权并提交结算的交易都正确触发。

更麻烦的是,即使我收到错误并且braintree结算的交易保持不变,控制器也会取消数据库中的状态。

为什么会出现这个错误?

【问题讨论】:

    标签: ruby-on-rails ruby transactions braintree braintree-rails


    【解决方案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
    

    【讨论】:

    • 我试过了,现在得到一个未定义的方法“成功了吗?”对于 nil:NilClass 错误
    • 那么voidrefund的返回值是多少?如果@transaction没有被授权、提交或结算怎么办?
    • 我检查了 transaction.status Braintree 正在发回并且它显示为“已解决”。那是由逻辑引起的rails错误。我收到错误是因为从未进行过 api 调用,并且我正在检查从未发送过的结果。如果状态不是已授权、提交_for_settlement 或已结算,它将在此处显示:redirect_to orders_path,警报:“无法取消交易代码:#{@result.transaction.processor_response_code} 文本:#{@result.transaction.processor_response_text} "n
    • 您建议在哪里添加类类 Braintree::Transaction?它会在整个 Rails 应用程序中全局访问吗?
    • 在 ruby​​ 中,类总是全局可访问的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多