Управление инициализацией Rails для приложения, извлеченного как движок

#ruby-on-rails-3.1

#ruby-on-rails-3.1

Вопрос:

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

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

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

Могу ли я внести какие-либо изменения в порядок загрузки инициализации (или пути загрузки в Engine < Rails::Определение класса Engine), которые предотвратили бы загрузку исходных конфигураций и инициализаторов в контексте движка и позволили бы мне оставить их на месте для контекста приложения?

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

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

Предполагая, что я чувствую какое-то неестественное принуждение поддерживать работоспособность моего исходного приложения в том виде, в каком оно было, если я хочу запретить «движку» загружать конфигурацию «приложения», каков наилучший способ справиться с этим? Я предполагаю, что на самом деле это проблема только во время разработки, потому что я могу предотвратить перенос файлов environments / *.rb в сам gem, но мне нравится иметь возможность тестировать локально, пока я разрабатываю движок и его клиентское приложение.

Ответ №1:

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

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

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

Комментарии:

1. Точно так же я это делаю.

Ответ №2:

Добавляю это для новичков.

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

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

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

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

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

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

Комментарии:

1. К сожалению, по крайней мере, в прошлый раз, когда я пытался это сделать, isolate_namespace не предотвратит запуск среды исходного созданного gem / *.rb при запуске приложения, вот почему у меня возник первоначальный вопрос. Конечно, возможно, что поведение изменилось в гораздо более поздней версии 3.1, чем я использовал в то время.