programing

xxx 복사본이 모듈 트리에서 제거되었지만 여전히 활성 상태임

javamemo 2023. 6. 24. 08:42
반응형

xxx 복사본이 모듈 트리에서 제거되었지만 여전히 활성 상태임

저는 그 오류가 실제 내용과 아무런 관련이 없다고 꽤 확신합니다.TenantIdLoader모듈.대신에, 그것은 어떤 것과 관련이 있습니다.ActiveSupport종속성.

저는 이 오류를 극복할 수 없을 것 같습니다.내가 읽은 바로는, 그것은 둘 중 하나이기 때문입니다.ActiveRecord::Base다시 로드 중이거나Company::TenantIdLoader다시 로드되고 있고, 어떻게든 그것을 전달하지 못하고 있습니다.도와주세요!Rails 4.2로 업그레이드할 수 있으면 좋겠습니다.

편집

이제서야 알게 된 것은 제가까운 이유는Tenant자동으로 다시 로드됩니다.제가 실제로 수업을 참고할 수 있어야 하는데, 이 문제를 피하는 방법을 아는 사람이 있나요?

config/application.message

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

config/initializers/company.message

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

lib/company/tenant_id_message.dll

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에는 이 모듈이 포함되어 있습니다. 레일이 이 모듈을 언로드했다고 생각하더라도 말입니다.이 오류는 테넌트를 참조할 때 발생합니다. 이는 레일이 테넌트를 실행하도록 하기 때문입니다.const_missingTenant를 로드해야 하는 위치와 지속적인 검색이 시작되는 모듈이 없어야 하기 때문에 코드가 이상하다는 것을 확인하기 위한 후크입니다.

세 가지 해결책이 있습니다.

  1. 모듈을 다시 로드할 수 없는 클래스에 포함하지 마십시오. 필요에 따라 개별 모델, 컨트롤러에 포함하거나 추상 기본 클래스를 만들어 모듈을 포함합니다.

  2. autoad_paths에 없는 곳에 저장하여 이 모듈을 다시 로드할 수 없도록 합니다(레일이 더 이상 마법적으로 로드하지 않으므로 명시적으로 필요합니다).

  3. 테넌트를 다음으로 변경::세입자(Object.const_missing그러면 호출됩니다.Tenant.const_missing)

ModuleName을 :::ModuleName으로 변경하는 것이 효과가 있었습니다.

이것이 누군가에게 도움이 될지는 모르겠지만, 저는 관련이 없어 보이는 변화 이후에 갑자기 이런 일이 일어나기 시작했습니다.애플리케이션 서버를 다시 시작한 후에 사라졌습니다.

ModuleName'ModuleName'.constantize저를 위해 그 문제를 해결했습니다.

이 문제를 해결하는 또 다른 방법은 다시 로드할 수 없는 파일에 모듈을 직접 요구하는 것입니다.

의 맨 lib/company/tenant_id_loader.rb 놓다require_relative '../../app/models/tenant'또는 테넌트 모델에 대한 ID 로더와 관련된 경로가 무엇이든 상관합니다.

나에게 효과가 있었던 것:

config.eager_load = falsetrue

config/environments/development.rb

25인치 2.6.5인치
5⁄5.1.6

언급URL : https://stackoverflow.com/questions/29636334/a-copy-of-xxx-has-been-removed-from-the-module-tree-but-is-still-active

반응형