2013-07-23 30 views
6

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?

risposta

1

Il metodo module_eval non funzionerà per voi.

Si dovrebbe guardare allo Spree Checkout Flow Documentation per alcuni buoni esempi su come personalizzare il flusso di checkout. Questo è il metodo consigliato per personalizzare il flusso di pagamento in quanto non è necessario copiare/incollare un intero gruppo di codice.

1

Il namespace non è corretto.

Prova Spree::Order::Checkout.class_eval do

0

tl; dr: sovrascrivere il metodo che si desidera nella classe Sprea :: Ordine al posto del modulo Checkout Sprea :: :: Order.

Hai menzionato che nel file originale (spree_core-3.2.0.rc3/app/models/spree/order/checkout.rb) c'è un metodo che avvolge l'intero modulo.

def self.included(klass) 
    klass.class_eval do 

Questo metodo viene chiamato quando il modulo è incluso in una classe, e fa il suo class_eval per aggiungere i metodi del modulo per le istanze della classe tra cui esso.

Quindi, dal momento (spree_core-3.2.0.rc3/app/modelli/Spree/order.rb) ha questa linea:

include Spree::Order::Checkout 

Possiamo aggiungere un decoratore alla classe ordine stesso (APP/modelli /spree/order_decorator.rb)