如何在可重新加载开发环境的情况下将可安装引擎的模型扩展到另一个可安装引擎中

使用Rails 3.2.2和Ruby 1.9.2。

我有一个rails可安装引擎EngineA ,它声明一个inheritanceActiveRecord::Baseforms的User类。 我有另一个引擎EngineB想要向EngineA::User注入function。 现在我所做的如下所示:

方法1:

 #EngineA app/models/engine_a/user.rb module EngineA class User < ActiveRecord::Base has_attached_file :avatar has_many :somethings end end #EngineB lib/engine_b/user.rb module EngineB module User def self.extended obj obj.class_eval do has_many :something_elses end end end end EngineA::User.extend EngineB::User 

这给了我一个uninitialized constant EngineA::User错误。 即使我需要特定文件,我EngineA需要回形针的问题,以便了解has_attached_file 。 当我意识到我必须知道并要求EngineA内的EngineB的依赖关系时,这条道路就结束了。

方法2:

我使用了与之前相同的代码,只是我从EngineB user.rb文件中删除了最后一行EngineA::User.extend EngineB::User 。 然后我将该调用移动到EngineB内的初始化EngineB

 #EngineB config/initializers/my_mixin.rb EngineA::User.extend EngineB::User 

这完美地工作! 除了在开发模式下我会更改代码并且模型会刷新。 唯一刷新的是EngineA::User而不是我作为初始化程序EngineA::User的mixin。 因此,一旦我更改了代码,我就失去了所有扩展function。

我甚至不肯定这是最“有效”的方式来做到这一点…任何帮助都将非常感激。 提前致谢。

根据配置文档 ,您可以使用ActionDispatch回调来加载项目。 如果cache_classes设置为false,则在每次请求时都会运行这些回调,就像在开发模式下一样。

在您的EngineB.rb文件中,您可以尝试这样的事情:

 if Rails.env.development? ActionDispatch::Callbacks.to_prepare do load "#{File.expand_path(File.dirname(__FILE__))}/../config/initializers/my_mixin.rb" end end