Xxx'in bir kopyası modül ağacından kaldırıldı, ancak hala aktif


129

Hatanın TenantIdLoadermodülün gerçek içeriğiyle ilgisi olmadığından oldukça eminim . Bunun yerine, ActiveSupportBağımlılıklar ile bir ilgisi vardır .

Bu hatayı geçemiyorum. Okuduklarıma göre, bunun nedeni ya ActiveRecord::Baseyeniden yükleniyor ya Company::TenantIdLoaderda yeniden yükleniyor ve bir şekilde bunu iletmiyor. Yardım lütfen! Rails 4.2'ye yükseltilmeyi gerçekten çok isterim.

DÜZENLE

Şimdi öğrendim ki bunun Tenantotomatik olarak yeniden yüklenecek olana referans veriyorum . Yine de sınıfa gerçekten başvurabilmem gerekiyor, bu yüzden bunu nasıl aşacağını bilen var mı?

config / application.rb

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

yapılandırma / başlatıcılar / company.rb

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

lib / şirket / 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
Bu cevap hiç yardımcı oluyor mu? stackoverflow.com/questions/17561697/…
Waynn Lue

Kiracı sınıfının dahil olduğundan emin misiniz? Kiracı kullanan o kodun parçalarını çıkarırsanız, yine de bir hata alıyor musunuz?
Frederick Cheung

@WaynnLue evet Sanırım nedeni bu, nasıl düzelteceğimi bilmiyorum.
kddeisz

@FrederickCheung Aynı şekilde hata veren buna benzer başka bir dosyam var ve her zaman Kiracı ile ilgili satırda hata yapıyor, bu yüzden en iyi tahminimdir.
kddeisz

1
Burada Wisper'ı Rails'de kullanmıyor olsanız da, bu konudaki tavsiyelere uymazsanız Wisper'ın bu soruna oldukça tutarlı bir şekilde neden olduğunu belirtmek diğer insanlar için yararlı olabilir: stackoverflow.com/questions/28346609/…
Steve N

Yanıtlar:


182

Tenantbir tür kırmızı ringa balığı - rayların const_missinghilesi ile yüklenmesi gereken herhangi bir uygulamaya referans verdiyseniz hata meydana gelir .

Sorun, yeniden yüklenebilen bir şey (modülünüz) alıp ardından onu yeniden yüklenemeyen bir şeye ( ActiveRecord::Baseveya önceki örneğinizde ActionMailer::Base) dahil etmenizdir . Bir noktada kodunuz yeniden yüklenir ve şimdi ActiveRecord, raylar onu kaldırdığını düşünse bile bu modülün içinde yer almaktadır. Hata, Kiracı'ya başvurduğunuzda ortaya çıkar, çünkü bu rayların const_missingKiracı'nın nereden yüklenmesi gerektiğini bulmak için kancalarını çalıştırmasına neden olur ve bu kod çıldırır çünkü sürekli aramanın başladığı modül orada olmamalıdır.

3 olası çözüm vardır:

  1. Modülünüzü yeniden yüklenemeyen sınıflara dahil etmeyi bırakın - ya bireysel modellere, denetleyicileri gerektiği gibi ekleyin ya da soyut bir temel sınıf oluşturun ve modülü buraya ekleyin.

  2. Autoload_paths içinde olmayan bir yerde depolayarak bu modülü yeniden yüklenemez hale getirin (raylar artık sizin için sihirli bir şekilde yüklemeyeceğinden bunu açıkça istemeniz gerekecek)

  3. Kiracıyı :: Kiracı olarak değiştirme ( Object.const_missingdaha sonra çağrılacak, değil Tenant.const_missing)


30
Üçüncü bir çözüm bulmuş gibiyim, bunun neden işe yaradığını bilip bilmediğinizi merak ediyordum. Şunu referans verirsem :: Kiracı, her şey sihirli bir şekilde işliyor. Muhtemelen, daha sonra üst düzey sabit olarak yüklediği için mi? Olabilir?
kddeisz

3
İşlerin bu yüzden o zaman Object.const_missing YourModule.const_missing değil çağrılır işte
Frederick Cheung

6
Kullanarak üst seviyeye geri dönmek ::benim için de işe yaradı!
Alex Moore-Niemi

7
Bu sorunu zaman zaman yaşadım ve benim durumumda baharla ilgiliydi, bu yüzden yapmak sorunu çözmekti ./bin/spring stop.
santuxus

2
Ben AŞK bu bir olduğunu zamanı Yakut / Raylar hatası - başka herhangi bir dil, dinamik ya da değil aksine Yakut geliştiricilere anlamıyla modüller program dek tanımlanan hiçbir fikrim yok sadık sınırsız esneklik sağlar yürütür (ve ne de sipariş o yürütür). Çok iyi tasarlanmış.
Andy Ray

32

Değişen modulename için :: modulename benim için çalıştı.


6

Bunun kimseye yardımcı olup olmayacağından emin değilim, ancak ilgisiz görünen bir değişiklikten sonra aniden bu olmaya başladım. Uygulama sunucusunu yeniden başlattıktan sonra kayboldu.


0

Değişen ModuleNameiçin 'ModuleName'.constantizebenim için çözülmesi sorunu.


0

Benim için ne işe yaradı:

Güncelleme config.eager_load = falseiçintrue

içinde config/environments/development.rb

Ruby 2.6.5
Raylar 5.1.6


1
Evet kesinlikle bunu yapma. Bu, geliştirme sırasında kodu yeniden yükleme yeteneğinizi öldürecek.
kddeisz

-13

Bazen sen sadece

Sunucunuzu yeniden başlatın,


Bu yanıta neden olumsuz oy verdiğinizi anlamıyorum? Tekrarlamak, önemli olduğu anlamına gelir! Neden basit şeyler çok saçma sapan şeylere sahiptir?
Albert.Qing

7
Bu, (a) sunucunuzu kaç kez yeniden başlatırsanız yeniden başlatırsanız orijinal sorudaki sorunu çözmeyeceği ve (b) bir sorunun semptomlarını değil, sorunun kendisini tedavi etmeniz gerektiği için olumsuz oylanmıştır.
tjbp

@tjbp plz "bazen" kelimesine dikkat et tamam mı?
Albert. Qing

sorun, her değişiklikten sonra sunucuyu yeniden başlatmanız gerekiyorsa, uygulama geliştirme modunda hata ayıklamanın imkansız olmasıdır.
Max Ivak

2
Bu cevaba oy vereceğim çünkü mongoid kullanıyorsanız ve X nesnesini ray konsolundan silerseniz, şu hatayı alırsınız: A copy of X has been removed from the module tree but is still activeObject Y.embeds Xve yeniden başlatma sunucusu olan tüm sayfalarda gerçekten bu özel durum için çalışır. Ama cevabınızı düzenlemelisiniz.
Lucas Andrade
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.