我需要覆盖控制器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
答案 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
您需要覆盖该功能以添加您正在寻找的逻辑。