[ruby-on-rails] xxx의 사본이 모듈 트리에서 제거되었지만 여전히 활성 상태입니다.

나는 오류가 TenantIdLoader모듈 의 실제 내용과 관련이 없다고 확신합니다 . 대신 ActiveSupport종속성과 관련이 있습니다.

이 오류를 지나칠 수없는 것 같습니다. 내가 읽은 바에 따르면, 그것은 ActiveRecord::Base재 장전되거나 재 장전 되기 때문 Company::TenantIdLoader입니다. 그리고 그것은 어떻게 든 그것을 전달하지 않습니다. 도와주세요! Rails 4.2로 업그레이드하고 싶습니다.

편집하다

Tenant자동으로 다시로드되는 것을 참조하기 때문이라는 것을 이제 알게되었습니다 . 하지만 실제로 클래스를 참조 할 수 있어야하는데이 문제를 해결하는 방법을 아는 사람이 있습니까?

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



답변

Tenant이것은 일종의 붉은 청어 const_missing입니다. 레일스의 트릭 으로로드해야하는 앱을 참조하면 오류가 발생합니다 .

문제는 다시로드 할 수있는 항목 (모듈)을 가져 와서 다시로드 할 수없는 항목에 포함하는 것입니다 ( ActiveRecord::Base또는 이전 예제에서 ActionMailer::Base). 어느 시점에서 코드가 다시로드되고 이제 ActiveRecord는 레일이 코드를 언로드했다고 생각하더라도 여전히이 모듈을 포함합니다. 테넌트를 참조 할 때 오류가 발생합니다. 이로 인해 레일이 const_missing후크 를 실행하여 테넌트를로드해야하는 위치를 알아 내고 상수 검색이 시작되는 모듈이 없어야하기 때문에 해당 코드가 놀랍습니다.

세 가지 가능한 솔루션이 있습니다.

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

  2. 이 모듈을 autoload_paths에없는 곳에 저장하여 다시로드 할 수 없도록 만드십시오 (레일이 더 이상 마법처럼로드하지 않기 때문에 명시 적으로 요구해야합니다).

  3. 테넌트를 :: Tenant로 변경 ( Object.const_missing그러면이 아니라 호출 됨 Tenant.const_missing)


답변

ModuleName:: ModuleName으로 변경하면 저에게 효과적 이었습니다.


답변

이것이 누구에게도 도움이 될지 확실하지 않지만 관련이없는 것처럼 보이는 변화 후에 갑자기 발생하기 시작했습니다. 응용 프로그램 서버를 다시 시작한 후에 사라졌습니다.


답변

나를 위해 문제 ModuleName'ModuleName'.constantize해결하도록 변경 했습니다 .


답변

나를 위해 일한 것 :

업데이트 config.eager_load = falsetrue

config/environments/development.rb

루비 2.6.5
레일스 5.1.6


답변

가끔은 그냥

서버를 다시 시작하십시오.


답변