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?