6

我正在为我的网上商店使用 Spree Commerce。我想在结帐过程中更改一些行为,这是在app/models/spree/order/checkout.rbspree gem 中定义的。所以我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了,但它也不起作用。我该如何解决这个问题?

4

3 回答 3

1

module_eval 方法对您不起作用。

您应该查看Spree Checkout Flow 文档以获取有关如何自定义结帐流程的一些很好的示例。这是自定义结帐流程的推荐方式,因为您不需要复制/粘贴一大堆代码。

于 2013-07-23T15:57:43.863 回答
1

命名空间不对。

尝试Spree::Order::Checkout.class_eval do

于 2016-02-11T10:23:40.513 回答
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)

于 2017-05-19T17:35:54.343 回答