Sto utilizzando Spree Commerce per il mio negozio online. Voglio cambiare qualche comportamento durante il processo di checkout, che è definito in app/models/spree/order/checkout.rb
all'interno della gemma spree. Così ho creato uno checkout_decorator.rb
nello stesso punto della mia applicazione.Decoratore del modulo Spree
Il problema è che le mie modifiche non sono state caricate. E un altro problema è che tutto all'interno del modulo si trova all'interno di un metodo, il metodo def self.included(klass)
. Quindi penso di dover sovrascrivere l'intero file, invece di un solo metodo. Ecco ciò che il mio decoratore assomiglia:
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
Il file originale checkout.rb
dalla gemma baldoria assomiglia a questo:
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
Quindi le mie domande sono: Perché questo non funziona? module_eval
è il modo giusto per farlo? Ho provato class_eval
ma non funziona neanche. Come posso risolvere questo?