我在网上商店使用Spree Commerce。我想在结帐过程中更改一些行为,这在spree gem中的app/models/spree/order/checkout.rb
中定义。所以我在我的申请中的同一点做了一个checkout_decorator.rb
。
问题是,我的更改未加载。另一个问题是,模块内部的所有内容都在一个方法def self.included(klass)
方法内。所以我认为我必须覆盖整个文件,而不是只覆盖一个方法。这是我的装饰者的样子:
checkout_decorator.rb
Spree::Order::Checkout.module_eval do
def self.included(klass)
klass.class_eval do
class_attribute :next_event_transitions
class_attribute :previous_states
class_attribute :checkout_flow
class_attribute :checkout_steps
def self.define_state_machine!
# here i want to make some changes
end
# and the other methods are also include here
# for readability, i don't show them here
end
end
end
spree gem中的原始文件checkout.rb
如下所示:
module Spree
class Order < ActiveRecord::Base
module Checkout
def self.included(klass)
klass.class_eval do
class_attribute :next_event_transitions
class_attribute :previous_states
class_attribute :checkout_flow
class_attribute :checkout_steps
def self.checkout_flow(&block)
if block_given?
@checkout_flow = block
define_state_machine!
else
@checkout_flow
end
end
def self.define_state_machine!
# some code
end
# and other methods that are not shown here
end
end
end
end
end
所以我的问题是:为什么这不起作用? module_eval
是正确的方法吗?我试过class_eval
,但它也不起作用。我该如何解决这个问题?
答案 0 :(得分:1)
module_eval方法不适合你。
您应该查看Spree Checkout Flow Documentation以获取有关如何自定义结帐流程的一些好例子。这是自定义结帐流程的推荐方法,因为您不需要复制/粘贴大量代码。
答案 1 :(得分:1)
命名空间不对。
尝试Spree::Order::Checkout.class_eval do
答案 2 :(得分:0)
tl; dr:在Spree :: Order类中覆盖您想要的方法,而不是Spree :: Order :: Checkout模块。
你提到在原始文件(spree_core-3.2.0.rc3 / app / models / spree / order / checkout.rb)中有一个包装整个模块的方法。
def self.included(klass)
klass.class_eval do
当模块包含在类中时调用此方法,并执行自己的class_eval
以将模块的方法添加到包含它的类的实例中。
因此(spree_core-3.2.0.rc3 / app / models / spree / order.rb)有这一行:
include Spree::Order::Checkout
我们可以在订单类本身添加装饰器(app / models / spree / order_decorator.rb)