Ruby on rails 3.1 控制提取为引擎的应用程序的Rails初始化

Ruby on rails 3.1 控制提取为引擎的应用程序的Rails初始化,ruby-on-rails-3.1,Ruby On Rails 3.1,我希望Rails应用程序既可以作为引擎使用,也可以作为独立应用程序使用 具体来说,我有一个新生的应用程序,我想把它插入客户的网站,但理想的情况是,我想把它作为一个独立的系统来使用。但是,如果我的应用程序的引擎化版本中存在config/environments/*.rb,则在我依赖于我的引擎的应用程序启动时,我会收到一个未初始化的常量错误;Rails抱怨在development.rb中找不到MyEngineModule::Application常量,我认为这只是一个加载顺序问题,因为在我独立运行应

我希望Rails应用程序既可以作为引擎使用,也可以作为独立应用程序使用

具体来说,我有一个新生的应用程序,我想把它插入客户的网站,但理想的情况是,我想把它作为一个独立的系统来使用。但是,如果我的应用程序的引擎化版本中存在config/environments/*.rb,则在我依赖于我的引擎的应用程序启动时,我会收到一个未初始化的常量错误;Rails抱怨在development.rb中找不到MyEngineModule::Application常量,我认为这只是一个加载顺序问题,因为在我独立运行应用程序时不会发生这种情况。如果我删除development.rb,引用MyEngineModule::Application的原始初始值设定项会抱怨,因此我尝试删除这些初始值设定项,一切正常

很好,除了原来的应用程序不工作,因为它的配置已经不存在了

我是否可以对初始化加载顺序(或加载路径,在Engine 更简单的答案可能是这样的,但我觉得很固执,我想知道怎样才能实现我最初的目标:

  • 将MyEngine的代码提取到引擎中,删除config/environments/*文件和config/initializer/*文件,并使客户端应用程序依赖于此
  • 使“新”极简主义应用程序依赖MyEngine,并将环境文件和初始值设定项移动到NewApp

假设我感觉到某种非自然的强迫,使我原来的应用程序保持运行状态,如果我想阻止“引擎”加载“应用程序”配置,那么最好的处理方法是什么?我认为这只是开发过程中的一个问题,因为我可以防止环境/*.rb文件被拉入gem本身,但我喜欢在开发引擎及其客户端应用程序时能够进行本地测试。

继续我回答自己深奥问题的传统,似乎一个可行的替代方案是在引擎的Environment/*.rb和初始化器中包含一个guard子句,其内容如下:

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

这就解决了以相对较小的成本拥有两个Rails::Application对象的问题。不太高兴,但我会活下去。

为新来的人做这个

Rails 3.1配备了可安装的引擎,这听起来正是您所描述的。这些文档不适合转换现有代码,但它看起来可以满足您的需要:

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


这与我的做法完全相同。不幸的是,至少在我上次尝试这一方法时,isolate_名称空间不会阻止原始enginified gem的environments/*.rb在应用程序启动时运行,这就是我最初的问题所在。当然,在比我当时使用的3.1版本晚得多的版本中,行为发生了变化。
mount CuteEngine::Engine, at: "/cuteness"