Украсьте помощника движка Rails, чтобы включить в него проблему из основного приложения - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел включить ActiveSupport :: Concern из приложения в движок, украшая один из вспомогательных модулей движка. Вот помощник от двигателя:

module MyEngine
  module MyHelper
  end
end

Вот Концерн из основного приложения:

module MyConcern
  extend ActiveSupport::Concern

  def do_this
  end

  def do_that
  end
end

Ниже приведен подсвеченный движок движка, который должен включать в себя вопрос (для использования в представлениях движка) - он объявлен в основном приложении *1008* с использованием шаблона декоратора, описанного в руководствах Rails :

module MyEngine
  module MyHelper
    include MyConcern

    def do_stuff
    end
  end
end

Декорированный помощник правильно загружен двигателем, но представления двигателя могут вызывать только "do_stuff". Методы из MyConcern недоступны, и мне трудно понять, почему. Я также попытался включить проблему, включив ее в вызов MyEngine :: MyHelper.module_eval, но это тоже не сработало.

Кто-нибудь сталкивался с такой проблемой раньше? Я правильно понял?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я думаю, что вы можете рассуждать об этом задом наперед.

Если ваш двигатель обеспечивает:

module MyEngine
  module MyHelper
    def foo
    end
  end
end

Вы можете расширить метод (вы можете назвать его decorate, но я не уверен, технически ли это шаблон декоратора) в вашем основном приложении:

module MainApp
  module MyHelper
    extend ::MyEngine::MyHelper
    def foo
      super
      do_something_else
    end
  end
end

При использовании шаблона module-mixin (что и делает ActiveSupport :: Concern) вы расширяете модули модулями и включаете модули в классы.

Если ваш движок и основное приложение «разделяют частичное» - его нужно просто поместить в движок, так как Rails сначала будет искать представление при рендеринге в каталоге app / views приложения, прежде чем искать его смонтированные движки.

Таким образом, основное приложение всегда может переопределить функции, предоставляемые движком, в то время как обратное неверно.

Если вы хотите сделать метод, предоставляемый конфигурируемым движком, лучше использовать параметр конфигурации Rails (или отдельную конфигурацию модуля) или просто аргументы метода, а не какой-нибудь сумасшедший цирк с круговой зависимостью.

0 голосов
/ 09 января 2019

Я переместил MyHelper из модуля в класс

module MyConcern
  extend ActiveSupport::Concern

  def do_this
    "do this"
  end

  def do_that
    "do that"
  end
end

module MyEngine
  class MyHelper
    include ::MyConcern

    def do_stuff
      "do stuff"
    end
  end
end

При звонке:

MyEngine::MyHelper.new.do_stuff
MyEngine::MyHelper.new.do_this
MyEngine::MyHelper.new.do_that

Результат будет:

делать вещи

сделать это

сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...