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_missing
Tenant를 로드해야 하는 위치와 지속적인 검색이 시작되는 모듈이 없어야 하기 때문에 코드가 이상하다는 것을 확인하기 위한 후크입니다.
세 가지 해결책이 있습니다.
모듈을 다시 로드할 수 없는 클래스에 포함하지 마십시오. 필요에 따라 개별 모델, 컨트롤러에 포함하거나 추상 기본 클래스를 만들어 모듈을 포함합니다.
autoad_paths에 없는 곳에 저장하여 이 모듈을 다시 로드할 수 없도록 합니다(레일이 더 이상 마법적으로 로드하지 않으므로 명시적으로 필요합니다).
테넌트를 다음으로 변경::세입자(
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 = false
true
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
'programing' 카테고리의 다른 글
64비트 애플리케이션의 메모리 사용량 오버헤드는 얼마입니까? (0) | 2023.06.24 |
---|---|
벡터화는 무엇을 의미합니까? (0) | 2023.06.24 |
MongoDB는 동시 업데이트를 어떻게 처리합니까? (0) | 2023.06.24 |
Oracle SQL Developer에서 테이블을 생성할 때 권한 부족 (0) | 2023.06.24 |
삽입 중 고유 제약 조건 위반: 왜? (Oracle) (0) | 2023.06.19 |