4

我希望让 Rails 应用程序既可用作引擎,也可用作独立应用程序。

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

太好了,除了原来的应用程序不起作用,因为它的配置已经消失了。

是否可以对初始化加载顺序(或加载路径,在 Engine < Rails::Engine 类定义中)进行一些调整,以防止在引擎上下文中加载原始配置和初始化程序,并允许我离开它们适合应用程序上下文吗?

更简单的答案可能是这样,但我觉得很固执,想知道如何才能使我最初的目标成为可能:

  • 将 MyEngine 的代码提取到引擎中,删除 config/environments/* 文件和 config/initializers/* 文件,并使客户端应用程序依赖于此。
  • 制作一个依赖 MyEngine 的“新”极简应用,并将环境文件和初始化程序移动到 NewApp。

假设我有一些不自然的冲动让我的原始应用程序保持可运行状态,如果我想阻止“引擎”加载“应用程序”配置,那么最好的处理方法是什么?我认为这只是开发过程中的一个问题,因为我可以防止将 environment/*.rb 文件拉入 gem 本身,但我喜欢在开发引擎及其客户端应用程序时能够在本地进行测试。

4

2 回答 2

6

继续我回答自己深奥问题的传统,似乎一种可行的选择是在引擎的环境/*.rb 和初始化程序中包含一个保护子句,如下所示:

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

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

于 2011-06-14T18:02:02.747 回答
1

为新来者撞上这个。

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

于 2013-01-23T14:45:35.287 回答