Tenho certeza de que o erro não tem nada a ver com o conteúdo real do TenantIdLoader
módulo. Em vez disso, tem algo a ver com ActiveSupport
dependências.
Não consigo superar esse erro. Pelo que li, é porque ActiveRecord::Base
está sendo recarregado ou Company::TenantIdLoader
recarregado, e de alguma forma não está comunicando isso. Ajuda por favor! Eu realmente gostaria de poder ser atualizado para o Rails 4.2.
EDITAR
Agora eu aprendi que é porque estou Tenant
fazendo referência a qual está sendo recarregada automaticamente. Eu preciso ser capaz de realmente fazer referência à classe, então alguém sabe como contornar isso?
config / application.rb
config.autoload_paths += %W( #{config.root}/lib/company )
config / inicializadores / empresa.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
ruby-on-rails
ruby
ruby-on-rails-4
kddeisz
fonte
fonte
Respostas:
Tenant
é uma espécie de arenque vermelho - o erro ocorreria se você referenciasse algum aplicativo que precise ser carregado peloconst_missing
truque dos trilhos .O problema é que você está pegando algo recarregável (seu módulo) e, em seguida, incluindo-o em algo não recarregável (
ActiveRecord::Base
ou, no seu exemplo anteriorActionMailer::Base
). Em algum momento, seu código foi recarregado e agora o ActiveRecord ainda possui este módulo, mesmo que o Rails pense que o descarregou. O erro ocorre quando você faz referência ao inquilino porque isso faz com que os trilhos executem seusconst_missing
ganchos para descobrir de onde o inquilino deve ser carregado e esse código fica assustador porque o módulo em que a pesquisa constante está começando não deve estar lá.Existem 3 soluções possíveis:
Pare de incluir seu módulo em classes não recarregáveis - inclua em modelos individuais, controladores conforme necessário ou crie uma classe base abstrata e inclua o módulo.
Torne este módulo não recarregável, armazenando-o em algum lugar que não esteja em autoload_paths (você precisará exigi-lo explicitamente, pois os trilhos não o carregarão mais magicamente para você)
Alterar inquilino para :: inquilino (
Object.const_missing
será invocado, nãoTenant.const_missing
)fonte
::
funcionou para mim também!./bin/spring stop
resolvê-lo.Alterar ModuleName para :: ModuleName funcionou para mim.
fonte
Não tenho certeza se isso vai ajudar alguém, mas de repente comecei a acontecer depois de uma mudança que parecia não ter relação. Ele desapareceu depois que eu reiniciei o servidor de aplicativos.
fonte
Mudar
ModuleName
para'ModuleName'.constantize
resolver o problema para mim.fonte
O que funcionou para mim:
Atualizar
config.eager_load = false
paratrue
no
config/environments/development.rb
Ruby 2.6.5
Rails 5.1.6
fonte
Às vezes você apenas
Reinicie seu servidor,
fonte
A copy of X has been removed from the module tree but is still active
em todas as páginas que possuem ObjectY.embeds X
e o servidor de reinicialização realmente funciona para este caso específico. Mas você deve editar sua resposta.