2013-07-23 33 views
6

Tôi đang sử dụng Spree Commerce cho Cửa hàng trực tuyến của mình. Tôi muốn thay đổi một số hành vi trong quá trình thanh toán, được xác định trong app/models/spree/order/checkout.rb bên trong đá quý Spree. Vì vậy, tôi đã thực hiện một số checkout_decorator.rb tại cùng một điểm trong đơn đăng ký của mình.Trang trí mô-đun Spree

Vấn đề là các thay đổi của tôi không được tải. Và một vấn đề nữa là, mọi thứ bên trong module nằm bên trong một phương thức, phương thức def self.included(klass). Vì vậy, tôi nghĩ rằng tôi phải ghi đè lên toàn bộ tập tin, thay vì chỉ là một phương pháp. Đây là những gì trang trí của tôi trông giống như:

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 

Các tập tin gốc checkout.rb từ đá quý Spree trông như thế này:

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 

Vì vậy, câu hỏi của tôi là: Tại sao điều này không làm việc? module_eval có đúng cách để thực hiện việc này không? Tôi đã thử class_eval nhưng nó cũng không hoạt động. Làm sao tôi có thể giải quyết việc này?

Trả lời

1

Phương pháp module_eval sẽ không hoạt động cho bạn.

Bạn nên xem Spree Checkout Flow Documentation để biết một số ví dụ hay về cách tùy chỉnh luồng thanh toán. Đây là cách được khuyến nghị để tùy chỉnh luồng thanh toán vì bạn sẽ không cần phải sao chép/dán toàn bộ một chuỗi mã.

1

Việc đặt tên không đúng.

Hãy thử Spree::Order::Checkout.class_eval do

0

tl; dr: Ghi đè phương thức mà bạn muốn trong lớp Spree :: thứ tự thay vì các mô-đun Spree :: Order :: Checkout.

Bạn đã đề cập rằng trong tệp gốc (spree_core-3.2.0.rc3/app/models/spree/order/checkout.rb) có một phương thức gói toàn bộ mô-đun.

def self.included(klass) 
    klass.class_eval do 

Phương pháp này được gọi khi các mô-đun được bao gồm trong một lớp học, và làm riêng của mình class_eval để thêm các phương pháp của module để thể hiện của lớp bao gồm nó.

Vì vậy, kể từ (spree_core-3.2.0.rc3/app/mô hình/Spree/order.rb) có dòng này:

include Spree::Order::Checkout 

Chúng ta có thể thêm một trang trí với lớp trật tự riêng của mình (ứng dụng/mô hình /spree/order_decorator.rb)

Các vấn đề liên quan