xxx的副本已从模块树中删除,但仍处于活动状态

我很确定这个错误与TenantIdLoader模块的实际内容无关。 相反,它与ActiveSupport依赖关系有关。

我似乎无法通过这个错误。 从我读过的,这是因为ActiveRecord :: Base正在重新加载或Company :: TenantIdLoader正在重新加载,并以某种方式不通信。 请帮助! 我真的很想升级到Rails 4.2。

编辑

我现在已经了解到,这是因为我引用了自动重新加载的Tenant。 我需要能够真正引用这个类,所以有人知道如何解决这个问题吗?

configuration/ application.rb中

config.autoload_paths += %W( #{config.root}/lib/company ) 

configuration/初始化/ company.rb

 ActionMailer::Base.send(:include, Company::TenantIdLoader) 

LIB /公司/ tenant_id_loader.rb

 module Company module TenantIdLoader extend ActiveSupport::Concern included do cattr_accessor :tenant_dependency self.tenant_dependency = {} after_initialize do self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero? end end # class methods to be mixed in module ClassMethods # returns true if this model's table has a tenant_id def tenant_dependent? self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id') end end end end 

Tenant是一种红鲱鱼 – 错误会发生,如果你引用任何需要由轨道的const_missing技巧加载的应用程序的位。

问题是,你正在重载(你的模块)的东西,然后把它包含在不可重载的东西( ActiveRecord::Base或者在你之前的例子ActionMailer::Base )。 在某些时候,你的代码被重新加载,现在ActiveRecord仍然包含这个模块,即使rails认为它已经卸载了它。 当你引用Tenant的时候会出现这个错误,因为这会导致rails运行它的const_missing钩子来找出Tenant应该从哪里加载,并且代码因为常量search从哪里开始的模块不应该在那里而const_missing

有三种可能的解决scheme:

  1. 停止将模块包含到不可重载的类中 – 根据需要将其包含到各个模型,控制器中或创build抽象基类,并将模块包含在其中。

  2. 通过将该模块存储在不在autoload_paths中的某个位置来使该模块无法重新加载(您将不得不明确要求它,因为rails将不再为您加载)

  3. 将Tenant更改为:: Tenant(然后调用Object.const_missing ,而不是Tenant.const_missing

ModuleName更改为:: ModuleName为我工作。