#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
Комментарии:
1. К сожалению, по крайней мере, в прошлый раз, когда я пытался это сделать, isolate_namespace не предотвратит запуск среды исходного созданного gem / *.rb при запуске приложения, вот почему у меня возник первоначальный вопрос. Конечно, возможно, что поведение изменилось в гораздо более поздней версии 3.1, чем я использовал в то время.