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

时间:2012-03-19 14:59:22

标签: ruby-on-rails ruby rails-engines

使用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 EngineBEngineA::User.extend EngineB::User的依赖关系时,那条道路就结束了。

方法2:

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

EngineA::User

这完美无缺!!! 除了在开发模式下我会改变代码并且模型会刷新。唯一被刷新的是{{1}},而不是我作为初始化器使用的mixin。因此,一旦我更改了代码,我就失去了所有扩展功能。

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

1 个答案:

答案 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