【发布时间】:2012-03-19 14:59:22
【问题描述】:
使用 Rails 3.2.2 和 Ruby 1.9.2。
我有一个轨道可安装引擎EngineA,它声明了一个User 类继承形式ActiveRecord::Base。我有另一个引擎EngineB 想要将功能注入EngineA::User。现在我所做的如下所示:
方法一:
#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 中的依赖项时,这条路就结束了。
方法二:
我使用了与之前相同的代码,只是我从EngineB user.rb 文件中删除了最后一行EngineA::User.extend EngineB::User。然后我将该调用移至 EngineB 内的初始化程序。
#EngineB config/initializers/my_mixin.rb
EngineA::User.extend EngineB::User
这很好用!!!除了在开发模式下,我会更改代码并且模型会刷新。唯一更新的是EngineA::User,而不是我作为初始化程序放置的mixin。所以一旦我更改了代码,我就失去了所有的扩展功能。
我什至不肯定这是最“有效”的方法......任何帮助将不胜感激。提前致谢。
【问题讨论】:
标签: ruby-on-rails ruby rails-engines