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


129

나는 오류가 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

3
이 답변이 도움이됩니까? stackoverflow.com/questions/17561697/…
Waynn Lue

테넌트 클래스가 관련되어 있습니까? 테넌트를 사용하는 코드의 일부를 스텁 처리해도 여전히 오류가 발생합니까?
Frederick Cheung

@WaynnLue 예, 그게 이유라고 생각합니다. 고치는 방법을 모르겠습니다.
kddeisz

@FrederickCheung 같은 방식으로 오류가 발생하는이 파일과 유사한 다른 파일이 있으며 항상 테넌트와 관련된 줄에서 오류가 발생하므로 내 최선의 추측입니다.
kddeisz 2015

1
여기서는 Rails에서 Wisper를 사용하고 있지 않지만이 스레드의 조언을 따르지 않으면 Wisper가이 문제를 상당히 일관되게 일으킨다는 점을 다른 사람들에게 유용 할 수 있습니다. stackoverflow.com/questions/28346609/…
Steve N

답변:


182

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

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

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

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

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

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


30
세 번째 해결책을 찾은 것 같지만 왜 작동하는지 알고 있는지 궁금합니다. 내가 언급하면 ​​:: Tenant, 모든 것이 마술처럼 작동합니다. 아마도 최상위 상수로로드하기 때문일까요? 아마도?
kddeisz

3
일을 해결해야하므로 다음은 Object.const_missing는 YourModule.const_missing하지 호출 될 것입니다
프레드릭 청

6
최상위에게 백업 사용하여 ::도 나를 위해 일한!
Alex Moore-Niemi

7
나는이 문제가 수시로 발생했으며 내 경우에는 봄과 관련이 있으므로 ./bin/spring stop해결했습니다.
santuxus

2
이것이 런타임 Ruby / Rails 오류 라는 점이 마음에 듭니다. 다른 언어와 달리 동적이든 아니든 Ruby는 개발자에게 프로그램이 실행될 때까지 모듈이 정의 된 위치 (및 실행 순서 )를 문자 그대로 알 수없는 진정한 무한한 유연성을 제공합니다 . 너무 잘 설계되었습니다.
Andy Ray


6

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


0

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


0

나를 위해 일한 것 :

업데이트 config.eager_load = falsetrue

config/environments/development.rb

루비 2.6.5
레일스 5.1.6


1
네, 절대 이러지 마세요. 그것은 개발에서 코드를 다시로드하는 능력을 죽일 것입니다.
kddeisz

-13

가끔은 그냥

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


이 답변을 왜 반대하는지 이해가 안 돼요? 반복하면 중요합니다! 왜 단순한 일에 말도 안되는 일이 많습니까?
Albert.Qing

7
이것은 (a) 서버를 몇 번 다시 시작하더라도 원래 질문의 문제를 해결하지 못하며 (b) 문제의 증상을 단순히 처리하는 것이 아니라 문제 자체를 처리해야하기 때문에 거부되었습니다.
tjbp

@tjbp plz "때때로"라는 단어에주의하세요.
Albert.Qing dec. 05 '182018

문제는 모든 변경 후 서버를 다시 시작해야하는 경우 개발 모드에서 애플리케이션을 디버그 할 수 없다는 것입니다.
Max Ivak

2
mongoid를 사용하고 rails 콘솔에서 object X를 삭제하면이 오류가 발생하기 때문에이 답변에 투표 할 것입니다 .Object가 A copy of X has been removed from the module tree but is still active있는 모든 페이지에서 Y.embeds X서버를 다시 시작하면이 특정 경우에 실제로 작동합니다. 하지만 답을 수정해야합니다.
Lucas Andrade 19 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.