3

我需要从控制器checkout_controller.rb覆盖方法rescue_from_spree_gateway_error

我的网关正在返回这个:

Gateway Error   --- !ruby/object:ActiveMerchant::Billing::Response params:   success: false   order_status:    message: Autoriza��o negada   amount:    order:    transaction:  message: Autoriza��o negada success: false test: false authorization:  fraud_review:  avs_result:   code:    message:    street_match:    postal_match:  cvv_result:   code:    message:


这是我的覆盖,在/app/controllers/checkout_controller_decorator.rb

module Spree
  CheckoutController.class_eval do
    def rescue_from_spree_gateway_error(error)
      puts "==========================================="
      flash[:error] = error.message
      render :edit
    end
  end
end


我已经添加了,puts所以我可以在控制台上看到它,但它没有打印出来。


我还在puts方法声明上方添加了另一个,当我启动服务器时它会打印出来:

=> Booting WEBrick
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
!!!!!THIS IS ABOVE THE METHOD!!!!! [2013-09-05 16:33:31] INFO  WEBrick 1.3.1 [2013-09-05 16:33:31] INFO  ruby 1.9.3 (2013-06-27) [x86_64-linux] [2013-09-05 16:33:31] INFO  WEBrick::HTTPServer#start: pid=21635 port=3000


因此,它向我显示该类已加载,但从未调用该方法,就像上面返回的错误ActiveMerchant::Billing::Response不是网关错误一样。


有这一checkout_controller行在发生时调用该方法GatewayError

rescue_from Spree::Core::GatewayError, :with => :rescue_from_spree_gateway_error
4

2 回答 2

3

大礼包版本是 2.0.3。

为了完成这项工作,我必须覆盖两个文件,在以下位置创建它们:

app/controllers/checkout_controller_decorator.rb

app/models/order_decorator.rb

checkout_controller_decorator.rb代码:

module Spree
  CheckoutController.class_eval do
    def update
      if @order.update_attributes(object_params)
        fire_event('spree.checkout.update')
        return if after_update_attributes
        unless @order.next
          flash[:error] = @order.errors[:base].join("\n")
          redirect_to checkout_state_path(@order.state) and return
        end
        if @order.completed?
          session[:order_id] = nil
          flash.notice = Spree.t(:order_processed_successfully)
          flash[:commerce_tracking] = "nothing special"
          redirect_to completion_route
        else
          redirect_to checkout_state_path(@order.state)
        end
      else
        render :edit
      end
    end
  end
end

order_decorator.rb代码:

module Spree
  Order.class_eval do

    def process_payments!
      if pending_payments.empty?
        raise Core::GatewayError.new Spree.t(:no_pending_payments)
      else
        pending_payments.each do |payment|
          break if payment_total >= total

          payment.process!

          if payment.completed?
            self.payment_total += payment.amount
          end
        end
      end
      rescue Core::GatewayError => e
        result = !!Spree::Config[:allow_checkout_on_gateway_error]
        errors.add(:base, e.message) and return result
      end
    end
  end
end

问题出在版本上2.0.3,所以我不得不用版本中的文件更新这两个文件,2.0.4问题就解决了=)

于 2013-09-06T18:06:57.727 回答
2

您试图捕获的异常被更早地捕获。几乎可以肯定在这里:

https://github.com/spree/spree/blob/v2.0.4/core/app/models/spree/order.rb#L443

您需要覆盖该函数以添加您正在寻找的逻辑。

于 2013-09-06T15:45:19.317 回答