我希望将Rails应用程序作为引擎和独立应用程序使用。
具体来说,我有一个新的应用程序,我想插入到一个客户的网站,但理想的情况下,我想要像一个独立的系统一样容易地使用这个应用程序。但是,如果我的应用程序的引擎版本中存在config/environments/*..rb,我在应用程序启动时会遇到一个未初始化的常量错误;Rails抱怨说,在development.rb中找不到MyEngineModule::应用程序常量,我认为这只是一个加载顺序问题,因为当我单独运行应用程序时,不会出现这种情况。如果我删除development.rb,引用MyEngineModule::应用程序抱怨的原始初始化器,所以我尝试删除这些,一切都很好。
很好,除了原来的应用程序不能工作,因为它的配置已经消失了。
我是否可以对引擎< Rails::Engine类定义中的初始化加载顺序(或加载路径)进行一些调整,以防止在引擎上下文中加载原始信任和初始化器,并允许我将它们保留在应用程序上下文中?
更简单的答案可能是这个,但我觉得自己很固执,想知道要实现我最初的目标需要做些什么:
。
假设我感觉到了一些不自然的强制,让我的原始应用程序保持原样运行,如果我想阻止“引擎”加载“应用程序”配置,那么处理这个问题的最好方法是什么?我认为这只是在开发过程中的一个问题,因为我可以防止环境/*..rb文件被拖入宝石本身,但我喜欢在开发引擎及其客户端应用程序时能够在本地进行测试。
发布于 2011-06-14 18:02:02
继续我回答自己深奥问题的传统,似乎有一种可行的选择,就是在引擎的环境/*..rb和类似于这样的初始化器中添加一个卫士子句:
if defined? CuteEngine::Application
CuteEngine::Application.configure do
config.whatever = something
end
end这解决了两个Rails::应用程序对象成本相对较低的问题。不太高兴,但我会活下去的。
发布于 2013-01-23 14:45:35
把这个给新来的人。
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
https://stackoverflow.com/questions/6338110
复制相似问题