Estoy bastante seguro de que el error no tiene nada que ver con el contenido real del TenantIdLoader
módulo. En cambio, tiene algo que ver con las ActiveSupport
dependencias.
Parece que no puedo superar este error. Por lo que he leído, es porque ActiveRecord::Base
se está volviendo a cargar o Company::TenantIdLoader
se está volviendo a cargar, y de alguna manera no se está comunicando eso. ¡Ayuda por favor! Realmente me gustaría poder actualizarme a Rails 4.2.
EDITAR
Ahora he aprendido que es porque estoy haciendo referencia a Tenant
que se recarga automáticamente. Sin embargo, necesito poder hacer referencia a la clase, entonces, ¿alguien sabe cómo solucionar esto?
config / application.rb
config.autoload_paths += %W( #{config.root}/lib/company )
config / initializers / company.rb
ActionMailer::Base.send(:include, Company::TenantIdLoader)
lib / company / 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
fuente
Respuestas:
Tenant
es una especie de arenque rojo: el error ocurriría si hiciera referencia a cualquier bit de aplicación que deba cargarse con elconst_missing
truco de rails .El problema es que está tomando algo recargable (su módulo) y luego lo incluye en algo no recargable (
ActiveRecord::Base
o, en su ejemplo anteriorActionMailer::Base
). En algún momento, su código se vuelve a cargar y ahora ActiveRecord todavía tiene este módulo incluido, aunque rails cree que lo ha descargado. El error ocurre cuando hace referencia al Inquilino porque eso hace que los rieles ejecuten susconst_missing
ganchos para averiguar desde dónde se debe cargar el Inquilino y ese código se asusta porque el módulo desde el que comienza la búsqueda constante no debería estar allí.Hay 3 posibles soluciones:
Deje de incluir su módulo en clases no recargables: incluya en modelos individuales, controladores según sea necesario o cree una clase base abstracta e incluya el módulo allí.
Haga que este módulo no sea recargable almacenándolo en un lugar que no esté en autoload_paths (tendrá que requerirlo explícitamente ya que los rieles ya no lo cargarán mágicamente por usted)
Cambiar inquilino a :: inquilino (
Object.const_missing
se invocará, noTenant.const_missing
)fuente
::
funcionó para mí!./bin/spring stop
fue resolverlo.Cambiar ModuleName a :: ModuleName funcionó para mí.
fuente
No estoy seguro de si esto ayudará a alguien, pero de repente esto comenzó a ocurrir después de un cambio que parecía no estar relacionado. Se fue después de reiniciar el servidor de aplicaciones.
fuente
Cambiar
ModuleName
para'ModuleName'.constantize
resolver el problema para mí.fuente
Lo que funcionó para mí:
Actualizar
config.eager_load = false
atrue
en
config/environments/development.rb
Ruby 2.6.5
Rails 5.1.6
fuente
A veces solo
Reinicia tu servidor,
fuente
A copy of X has been removed from the module tree but is still active
en todas las páginas que tienen ObjectY.embeds X
, y reiniciar el servidor realmente funciona para este caso específico. Pero deberías editar tu respuesta.