Estoy bastante seguro de que el error no tiene nada que ver con el contenido real del TenantIdLoadermódulo. En cambio, tiene algo que ver con las ActiveSupportdependencias.
Parece que no puedo superar este error. Por lo que he leído, es porque ActiveRecord::Basese está volviendo a cargar o Company::TenantIdLoaderse 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 Tenantque 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:
Tenantes una especie de arenque rojo: el error ocurriría si hiciera referencia a cualquier bit de aplicación que deba cargarse con elconst_missingtruco de rails .El problema es que está tomando algo recargable (su módulo) y luego lo incluye en algo no recargable (
ActiveRecord::Baseo, 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_missingganchos 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_missingse invocará, noTenant.const_missing)fuente
::funcionó para mí!./bin/spring stopfue 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
ModuleNamepara'ModuleName'.constantizeresolver el problema para mí.fuente
Lo que funcionó para mí:
Actualizar
config.eager_load = falseatrueen
config/environments/development.rbRuby 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 activeen 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.