Spree - 覆盖checkout_controller方法

时间:2013-09-05 19:40:49

标签: override checkout spree

我需要覆盖控制器rescue_from_spree_gateway_error

中的方法checkout_controller.rb

我的网关正在返回:

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

2 个答案:

答案 0 :(得分:3)

Spree版本是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中的那些文件更新这两个文件,问题解决了=)

答案 1 :(得分:2)

您尝试捕获的异常正在被捕获。几乎可以肯定:

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

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