使用Rails 3.2.2和Ruby 1.9.2。
我有一个可安装rails的引擎EngineA
,声明User
类继承了ActiveRecord::Base
形式。我有另一个引擎EngineB
想要将功能注入EngineA::User
。现在我所做的事情如下所示:
方法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
内EngineA::User.extend EngineB::User
的依赖关系时,那条道路就结束了。
方法2:
我使用了与之前相同的代码,只是我从EngineB
user.rb文件中删除了最后一行EngineB
。然后我将该调用移至#EngineB config/initializers/my_mixin.rb
EngineA::User.extend EngineB::User
内的初始化程序。
EngineA::User
这完美无缺!!! 除了在开发模式下我会改变代码并且模型会刷新。唯一被刷新的是{{1}},而不是我作为初始化器使用的mixin。因此,一旦我更改了代码,我就失去了所有扩展功能。
我甚至不肯定这是最有效的方式来做到这一点......任何帮助都会非常感激。提前谢谢。
答案 0 :(得分:2)
根据configuration documentation,您可以使用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