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.