gpt4 book ai didi

overriding - Spree - 覆盖 checkout_controller 方法

转载 作者:行者123 更新时间:2023-12-01 19:35:42 29 4
gpt4 key购买 nike

我需要重写方法rescue_from_spree_gateway_error来自 Controller 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 返回的错误不是网关错误。< br/>


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

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

最佳答案

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 中的文件更新这两个文件,问题就解决了 =)

关于overriding - Spree - 覆盖 checkout_controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644590/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com