Невозможно переопределить метод в модели оживления

Я модернизирую свои рельсы и веселье до Rails 4.2 и Spree 3.1

Я переопределил purchase! метод в Payment модель

Вот как метод в веселье

module Spree
  class Payment < Spree::Base
    module Processing
      def purchase!
        started_processing!
        gateway_action(source, :purchase, :complete)
      end
    end
  end
end

Вот как это было переопределено в rails 3.2 (и это работало до сих пор)

Spree::Payment::Processing.class_eval do
  def purchase!
    started_processing!
    if source.class == Spree::PurchaseOrder
      gateway_action(source, :authorize, :pend)
    else
      gateway_action(source, :purchase, :complete)
    end
  end
end

Но теперь я получаю следующую ошибку с Rails 4.2 и Spree 3.1

/home/deepak/workspace/Project/app/models/spree/payment/processing_decorator.rb:2:in `<module:Spree>': superclass mismatch for class Payment (TypeError)
  from /home/deepak/workspace/Project/app/models/spree/payment/processing_decorator.rb:1:in `<top (required)>'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/zeus-0.15.10/lib/zeus/load_tracking.rb:76:in `load'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/zeus-0.15.10/lib/zeus/load_tracking.rb:76:in `load'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/zeus-0.15.10/lib/zeus/load_tracking.rb:68:in `load'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.7.1/lib/active_support/dependencies.rb:268:in `block in load'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.7.1/lib/active_support/dependencies.rb:240:in `load_dependency'
  from /home/deepak/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.7.1/lib/active_support/dependencies.rb:268:in `load'
  from /home/deepak/workspace/Project/config/application.rb:16:in `block (2 levels) in <class:Application>'
  from /home/deepak/workspace/Project/config/application.rb:15:in `glob'
  from /home/deepak/workspace/Project/config/application.rb:15:in `block in <class:Application>'

1 ответ

Решение
# /initializers/spree_overrides.rb
module Spree
  class Payment < Spree::Base
    module Processing
      def purchase!
        started_processing!
        if source.class == Spree::PurchaseOrder
          gateway_action(source, :authorize, :pend)
        else
          gateway_action(source, :purchase, :complete)
        end
      end
    end
  end
end

Имея его в инициализаторе, он переопределит исходный метод, определенный в Spree.

Другие вопросы по тегам