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:
-
停止将模块包含到不可重载的类中 – 根据需要将其包含到各个模型,控制器中或创build抽象基类,并将模块包含在其中。
-
通过将该模块存储在不在autoload_paths中的某个位置来使该模块无法重新加载(您将不得不明确要求它,因为rails将不再为您加载)
-
将Tenant更改为:: Tenant(然后调用
Object.const_missing
,而不是Tenant.const_missing
)
将ModuleName更改为:: ModuleName为我工作。