kdd*_*isz 118 ruby ruby-on-rails ruby-on-rails-4
我很确定错误与TenantIdLoader模块的实际内容无关.相反,它与ActiveSupport依赖关系有关.
我似乎无法克服这个错误.从我读过的内容来看,这是因为要么ActiveRecord::Base正在重新Company::TenantIdLoader加载,要么正在重新加载,而且它在某种程度上没有进行通信.请帮忙!我真的希望能够升级到Rails 4.2.
我现在已经知道这是因为我正在引用Tenant哪些是自动重新加载的.我需要能够实际引用该课程,所以有人知道如何解决这个问题吗?
配置/ application.rb中
config.autoload_paths += %W( #{config.root}/lib/company )
Run Code Online (Sandbox Code Playgroud)
配置/初始化/ company.rb
ActionMailer::Base.send(:include, Company::TenantIdLoader)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Fre*_*ung 166
Tenant是一种红色的鲱鱼 - 如果你引用任何需要由rails const_missing诀窍加载的应用程序,就会出现错误.
问题是你正在采取一些可重新加载的东西(你的模块),然后将它包含在一些不可重新加载的东西中(ActiveRecord::Base或者,在你之前的例子中ActionMailer::Base).在某些时候你的代码被重新加载,现在ActiveRecord仍然包含这个模块,即使rails认为它已经卸载了它.引用Tenant时会发生错误,因为这会导致rails运行其const_missing挂钩以找出应该从中加载Tenant的位置,并且该代码会因为常量搜索所在的模块不在那里而变得棘手.
有3种可能的解决方案:
停止将您的模块包含在非可重新加载的类中 - 根据需要包含到单个模型,控制器中或创建抽象基类并在其中包含模块.
通过将此模块存储在autoload_paths中的某个位置使该模块无法重新加载(您必须明确要求它,因为rails将不再为您神奇地加载它)
将租户改为::租户(Object.const_missing将被调用,而不是Tenant.const_missing)
| 归档时间: |
|
| 查看次数: |
44175 次 |
| 最近记录: |