Saya cukup yakin kesalahan tidak ada hubungannya dengan konten TenantIdLoader
modul yang sebenarnya. Sebaliknya, ini ada hubungannya dengan ActiveSupport
Dependensi.
Sepertinya saya tidak bisa melewati kesalahan ini. Dari apa yang saya baca, itu karena ActiveRecord::Base
sedang dimuat ulang atau Company::TenantIdLoader
dimuat 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 Tenant
yang 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
ruby-on-rails
ruby
ruby-on-rails-4
kddeisz
sumber
sumber
Jawaban:
Tenant
adalah semacam red herring - kesalahan akan terjadi jika Anda mereferensikan sedikit aplikasi yang perlu dimuat denganconst_missing
trik rel .Masalahnya adalah Anda mengambil sesuatu yang dapat dimuat ulang (modul Anda) dan kemudian memasukkannya ke dalam sesuatu yang tidak dapat dimuat ulang (
ActiveRecord::Base
atau, dalam contoh sebelumnyaActionMailer::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 menjalankanconst_missing
kaitnya 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:
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.
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)
Mengubah Tenant menjadi :: Tenant (
Object.const_missing
kemudian akan dipanggil, bukanTenant.const_missing
)sumber
::
berhasil untuk saya!./bin/spring stop
adalah mengatasinya.Mengubah ModuleName menjadi :: ModuleName berhasil untuk saya.
sumber
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.
sumber
Mengubah
ModuleName
untuk'ModuleName'.constantize
memecahkan masalah bagi saya.sumber
Apa yang berhasil untuk saya:
Perbarui
config.eager_load = false
ketrue
di
config/environments/development.rb
Ruby 2.6.5
Rails 5.1.6
sumber
Terkadang Anda begitu saja
Mulai ulang server Anda,
sumber
A copy of X has been removed from the module tree but is still active
di semua halaman yang memiliki ObjekY.embeds X
, dan server restart benar-benar berfungsi untuk kasus khusus ini. Tetapi Anda harus mengedit jawaban Anda.