Обратные вызовы не работают в модели декоратора Rails 5 Spree 4 - PullRequest
0 голосов
/ 27 марта 2020

Я новичок в Rails 5 / Spree 4, но не могу заставить работать обратные вызовы в моей модели. Я хочу запустить некоторые методы после создания продукта в Spree, но я не понимаю, что это included do совершенно новый для меня материал.

Модель: app/models/spree/product_decorator.rb

require 'active_support/concern'

module Spree
  module ProductDecorator
    extend ActiveSupport::Concern

    included do
        after_create :assign_prototype
    end

    def assign_prototype
        binding.pry
    end

  end
end

Полагаю, я упускаю из виду что-то глупое, но я уже час с этим возиться. Почему метод after_create здесь не распознается?

1 Ответ

2 голосов
/ 27 марта 2020

Это фактический пример, приведенный в документации :

module MyStore
  module Spree
    module ProductDecorator
      def some_method
        ...
      end
    end
  end
end

::Spree::Product.prepend MyStore::Spree::ProductDecorator

Как вы можете видеть, на самом деле ничего не происходит, если вы не включили / prepend ::Spree::Product в свой модуль. И вы также должны поместить свой код в свой собственный модуль, чтобы вы не забили существующий Spree::ProductDecorator.

included do
  # ...
end

Не имеет никакого отношения к Spree. Все это ActiveSupport :: Concern и включает в себя эту общую Ruby идиому:

module Spree
  module ProductDecorator
    def self.included(base)
      base.class_eval do
        after_create :assign_prototype
      end
    end

    def assign_prototype
      binding.pry
    end
  end
end

Module.included - это обратный вызов, встроенный в Ruby, который позволяет вам выполнить код в контексте класса, когда модуль включен в класс. То, как вы выполняете методы доступа, проверки, обратные вызовы и т. Д. c или все, что вы обычно делаете в теле класса модели в модуле mixin.

...