Управление инициализацией Rails для приложения, извлеченного как движок - PullRequest
4 голосов
/ 14 июня 2011

Я надеялся сделать приложение Rails пригодным для использования как в качестве движка, так и в качестве отдельного приложения.

В частности, у меня есть новое приложение, которое я хотел бы подключить к сайту клиента, но в идеалеЯ хотел бы так же легко использовать приложение, как автономную систему.Тем не менее, если config / environment / *. Rb существуют в версии моего приложения с расширенным доступом, я получаю ошибку Uninitialized Constant во время запуска приложения, которое у меня зависит от моего движка;Rails жалуется, что константа MyEngineModule :: Application не может быть найдена в development.rb, что, я думаю, является просто проблемой порядка загрузки, так как это НЕ происходит, когда я запускаю приложение автономно.Если я удаляю development.rb, исходные инициализаторы, ссылающиеся на мой MyEngineModule :: Application, будут жаловаться, поэтому я попытался удалить их, и все хорошо.

Отлично, за исключением того, что исходное приложение не работает,поскольку его конфигурация исчезла.

Есть ли какая-то настройка, которую я могу внести в порядок загрузки инициализации (или пути загрузки, в определении класса Engine

Возможно, более простой ответ, но я чувствую себя упрямым и хотел бы знать, что нужно сделать, чтобысделать возможной мою первоначальную цель:

  • распаковать код для MyEngine в движок, удалить файлы config / environment / * и config / initializer / * файлы, и заставить клиентское приложение зависеть от этого.
  • Сделать «новое» минималистское приложение зависимым от MyEngine и переместить файлы среды и инициализаторы в NewApp.

Если я чувствую какое-то неестественное принуждение сохранять работоспособность моего исходного приложения такой, какой оно было, если я хочу предотвратить загрузку конфигурации "движком" конфигурации "приложения", каков наилучший способ справиться с этим??Я предполагаю, что это действительно проблема только во время разработки, потому что я могу предотвратить попадание файлов environment / *. Rb в сам гем, но мне нравится иметь возможность локального тестирования во время разработки движка и его клиентского приложения.

Ответы [ 2 ]

6 голосов
/ 14 июня 2011

Продолжая мою традицию отвечать на мои собственные эзотерические вопросы, кажется, что одна приемлемая альтернатива - это включить условие охраны в окружение движка / *. Rb и инициализаторы, которые выглядят примерно так:

if defined? CuteEngine::Application
  CuteEngine::Application.configure do
    config.whatever = something
  end
end

Это решает проблему наличия двух объектов Rails :: Application при относительно небольших затратах.Не очень рад этому, но я буду жить.

1 голос
/ 23 января 2013

Поднять это для новичков.

Rails 3.1 поставляется с монтируемыми движками, которые звучат именно так, как вы описываете. Документы не очень хороши для преобразования существующего кода, но похоже, что это будет делать то, что вы хотите:

module CuteEngine
  class Engine < ::Rails::Engine
    isolate_namespace CuteEngine
  end
end

В файле rout.rb вашего другого приложения вы добавите:

mount CuteEngine::Engine, at: "/cuteness"

http://edgeguides.rubyonrails.org/engines.html#mounting-the-engine

http://railscasts.com/episodes/277-mountable-engines

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