2011-04-11 72 views
0

我试图将几个可重用的应用程序功能分解成Rails引擎。我一点问题都没有得到一个引擎的工作,但该应用程序似乎没有加载后续引擎的数据。我正在同时开发多个引擎,所以我要求它们通过:path选项加入我的testapp的gemfile。您可以将多个本地引擎添加到Rails 3应用程序吗?

这是我(简化)设置(我的最低限度,以建立一个简单的模型发动机的理解):

my_engines /引擎1/lib中/ engine1.rb:

module Engine1 
require 'engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3 
end 

my_engines /引擎1/lib目录/ engine.rb:

require 'engine1' 
require 'rails' 

module Engine1 
class Engine < Rails::Engine 

end 
end 

my_engines /引擎1 /应用/模型/引擎1/model1.rb:

module Engine1 
    class Model1 
    end 
end 

我的第二个引擎engine2的设置完全相同,并在同一个父目录中(只是名称为engine2和model2)。

我使用珠宝商打包并产生用于两个发动机gemspecs,并且我需要像这样在测试应用两个引擎:

my_engines/testapp/Gemfile中:

gem 'engine1', :path => '../engine1' 
gem 'engine2', :path => '../engine2' 

的奇怪的是,当我为我的testapp启动rails控制台时,Engine1 :: Model1.new工作,但Engine1 :: Model1.new导致“NameError:未初始化的常量Engine2 :: Model2”。这似乎适用于我包含在任何后续引擎中的所有模型,路线,控制器等。我搜索了互联网无济于事。有什么想法吗?

回答

1

我想我已经想通了。为了防止其他人碰巧使用Rails3引擎(很值得推荐),并且遇到了这个问题(希望不是), 问题是让我的engine.rb文件和我的engine_name.rb文件 都坐在旁边,并排在lib目录中。解决方法是在lib中创建一个engine_name dir,并将您的engine.rb文件放在那里(I guess Rails只加载它在gem或 插件的lib目录中找到的第一个engine.rb文件)。所以......

坏(只加载在主机应用程序一个engine.rb):

/some_engine 
    |-- lib 
    |-- some_engine.rb 
    |-- engine.rb 

似乎工作:

/some_engine 
    |-- lib 
    |-- some_engine.rb 
    |-- some_engine 
     |-- engine.rb 
相关问题