Salinan xxx telah dihapus dari pohon modul tetapi masih aktif

129

Saya cukup yakin kesalahan tidak ada hubungannya dengan konten TenantIdLoadermodul yang sebenarnya. Sebaliknya, ini ada hubungannya dengan ActiveSupportDependensi.

Sepertinya saya tidak bisa melewati kesalahan ini. Dari apa yang saya baca, itu karena ActiveRecord::Basesedang dimuat ulang atau Company::TenantIdLoaderdimuat ulang, dan entah bagaimana tidak mengkomunikasikannya. Tolonglah! Saya sangat ingin bisa ditingkatkan ke Rails 4.2.

EDIT

Saya sekarang telah belajar bahwa itu karena saya mereferensikan Tenantyang dimuat ulang secara otomatis. Saya harus benar-benar bisa mereferensikan kelas, jadi apakah ada yang tahu bagaimana menyiasatinya?

config / application.rb

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

config / penginisialisasi / perusahaan.rb

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

lib / perusahaan / 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
kddeisz
sumber
3
Apakah jawaban ini membantu sama sekali? stackoverflow.com/questions/17561697/…
Waynn Lue
Apakah Anda yakin kelas Tenant terlibat? Jika Anda mematikan bit kode yang menggunakan Penyewa, apakah Anda masih mendapatkan kesalahan?
Frederick Cheung
@WaynnLue ya saya pikir itu alasannya, saya hanya tidak tahu cara memperbaikinya.
kddeisz
@FrederickCheung Saya punya file lain yang mirip dengan ini yang error dengan cara yang sama, dan selalu error di baris yang terkait dengan Tenant, jadi tebakan terbaik saya.
kddeisz
1
Meskipun Anda tidak menggunakan Wisper in Rails di sini, mungkin berguna bagi orang lain untuk memperhatikan bahwa Wisper menyebabkan masalah ini secara konsisten jika Anda tidak mengikuti saran di utas ini: stackoverflow.com/questions/28346609/…
Steve N

Jawaban:

182

Tenantadalah semacam red herring - kesalahan akan terjadi jika Anda mereferensikan sedikit aplikasi yang perlu dimuat dengan const_missingtrik rel .

Masalahnya adalah Anda mengambil sesuatu yang dapat dimuat ulang (modul Anda) dan kemudian memasukkannya ke dalam sesuatu yang tidak dapat dimuat ulang ( ActiveRecord::Baseatau, dalam contoh sebelumnya ActionMailer::Base). Pada titik tertentu kode Anda dimuat ulang dan sekarang ActiveRecord masih memiliki modul ini yang disertakan di dalamnya meskipun menurut Rails telah dibongkar. Kesalahan terjadi ketika Anda mereferensikan Penyewa karena itu menyebabkan rel menjalankan const_missingkaitnya untuk mencari tahu dari mana Penyewa harus dimuat dan kode itu aneh karena modul tempat pencarian konstan dimulai seharusnya tidak ada di sana.

Ada 3 kemungkinan solusi:

  1. Berhenti memasukkan modul Anda ke dalam kelas yang tidak dapat dimuat ulang - baik sertakan ke dalam model individu, pengontrol sesuai kebutuhan, atau buat kelas dasar abstrak dan sertakan modul di sana.

  2. Jadikan modul ini tidak dapat dimuat ulang dengan menyimpannya di suatu tempat yang tidak ada di autoload_paths (Anda harus memerlukannya secara eksplisit karena rails tidak akan lagi memuatnya secara ajaib untuk Anda)

  3. Mengubah Tenant menjadi :: Tenant ( Object.const_missingkemudian akan dipanggil, bukan Tenant.const_missing)

Frederick Cheung
sumber
30
Sepertinya saya telah menemukan solusi ketiga, meskipun saya bertanya-tanya apakah Anda tahu mengapa itu berhasil. Jika saya mereferensikan itu: Penyewa, semuanya berjalan dengan ajaib. Mungkin karena itu kemudian memuatnya sebagai konstanta tingkat atas? Mungkin?
kddeisz
3
maka Object.const_missing yang akan dipanggil, bukan YourModule.const_missing sehingga semuanya akan berjalan lancar
Frederick Cheung
6
Mundur ke penggunaan tingkat atas juga ::berhasil untuk saya!
Alex Moore-Niemi
7
Saya mengalami masalah ini yang terjadi dari waktu ke waktu dan dalam kasus saya ini terkait dengan musim semi, jadi melakukannya ./bin/spring stopadalah mengatasinya.
santuxus
2
SAYA SUKA bahwa ini adalah runtime Ruby / Rails error - tidak seperti bahasa lain, dinamis atau tidak, Ruby memberi pengembang fleksibilitas tak terbatas yang sebenarnya untuk tidak tahu di mana modul didefinisikan sampai program Anda dijalankan (dan dalam urutan apa itu dijalankan). Ini dirancang dengan sangat baik.
Andy Ray
32

Mengubah ModuleName menjadi :: ModuleName berhasil untuk saya.

Aman Kumar
sumber
6

Tidak yakin apakah ini akan membantu siapa pun, tetapi saya mengalami ini tiba-tiba mulai terjadi setelah perubahan yang tampaknya tidak terkait. Itu hilang setelah saya memulai ulang server aplikasi.

beef_boolean
sumber
0

Mengubah ModuleNameuntuk 'ModuleName'.constantizememecahkan masalah bagi saya.

Qortex
sumber
0

Apa yang berhasil untuk saya:

Perbarui config.eager_load = falseketrue

di config/environments/development.rb

Ruby 2.6.5
Rails 5.1.6

Jan Werkhoven
sumber
1
Ya pasti jangan lakukan ini. Itu akan mematikan kemampuan Anda untuk memuat ulang kode dalam pengembangan.
kddeisz
-13

Terkadang Anda begitu saja

Mulai ulang server Anda,

Albert.Qing
sumber
Saya tidak mengerti mengapa tidak menyukai jawaban ini? Ulangi artinya penting! Mengapa hal-hal sederhana memiliki banyak omong kosong?
Albert.Qing
7
Ini adalah downvoted karena (a) tidak peduli berapa kali Anda me-restart server Anda, itu tidak akan menyelesaikan masalah dalam pertanyaan awal, dan (b) Anda seharusnya tidak hanya menangani gejala masalah, tetapi masalah itu sendiri.
tjbp
@ tjbp tlg hati-hati dengan kata "kadang" ok?
Albert.Qing
Masalahnya adalah tidak mungkin untuk men-debug aplikasi dalam mode pengembangan jika Anda harus memulai ulang server setelah setiap perubahan.
Max Ivak
2
Saya akan memilih jawaban ini karena jika Anda menggunakan mongoid dan menghapus objek X dari konsol rel, Anda akan mendapatkan kesalahan ini: A copy of X has been removed from the module tree but is still activedi semua halaman yang memiliki Objek Y.embeds X, dan server restart benar-benar berfungsi untuk kasus khusus ini. Tetapi Anda harus mengedit jawaban Anda.
Lucas Andrade