【问题标题】:How to extend a mountable engine's model inside another mountable engine with development environment reloading如何通过重新加载开发环境在另一个可安装引擎中扩展可安装引擎的模型
【发布时间】: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 的问题。当我意识到我必须知道并需要 EngineAEngineB 中的依赖项时,这条路就结束了。

方法二:

我使用了与之前相同的代码,只是我从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


    【解决方案1】:

    根据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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多