Я почти уверен, что ошибка не имеет ничего общего с фактическим содержимым TenantIdLoader
модуля. Вместо этого это как-то связано с ActiveSupport
зависимостями.
Я не могу избавиться от этой ошибки. Из того, что я читал, это потому, что либо ActiveRecord::Base
перезагружается, либо Company::TenantIdLoader
перезагружается, и почему-то не сообщает об этом. Помогите, пожалуйста! Я действительно хотел бы иметь возможность обновиться до Rails 4.2.
РЕДАКТИРОВАТЬ
Теперь я узнал, что это потому, что я ссылаюсь на то, Tenant
что перезагружается автоматически. Однако мне нужно иметь возможность ссылаться на класс, так что кто-нибудь знает, как это обойти?
конфиг / application.rb
config.autoload_paths += %W( #{config.root}/lib/company )
конфиг / Инициализаторы / company.rb
ActionMailer::Base.send(:include, Company::TenantIdLoader)
Библиотека / компания / 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
источник
источник
Ответы:
Tenant
это своего рода отвлекающий маневр - ошибка возникнет, если вы укажете какой-либо бит приложения, который нужно загрузить с помощьюconst_missing
уловки rails .Проблема в том, что вы берете что-то перезагружаемое (ваш модуль), а затем включаете его во что-то не перезагружаемое (
ActiveRecord::Base
или, как в вашем предыдущем примереActionMailer::Base
). В какой-то момент ваш код перезагружается, и теперь в ActiveRecord этот модуль все еще включен, хотя rails думает, что он его выгрузил. Ошибка возникает, когда вы ссылаетесь на Tenant, потому что это приводит к тому, что rails запускает своиconst_missing
перехватчики, чтобы выяснить, откуда следует загружать Tenant, и этот код пугает, потому что модуля, с которого начинается постоянный поиск, не должно быть.Есть 3 возможных решения:
Прекратите включать свой модуль в неперезагружаемые классы - либо включите в отдельные модели, контроллеры по мере необходимости, либо создайте абстрактный базовый класс и включите в него модуль.
Сделайте этот модуль не перезагружаемым, сохранив его где-нибудь, кроме autoload_paths (вам придется потребовать его явно, поскольку рельсы больше не будут загружать его волшебным образом для вас)
Изменение арендатора на :: арендатора (
Object.const_missing
тогда будет вызываться, а неTenant.const_missing
)источник
::
меня тоже сработал отказ от использования верхнего уровня !./bin/spring stop
решил ее.Изменение ModuleName на :: ModuleName сработало для меня.
источник
Не уверен, что это кому-то поможет, но у меня это внезапно начало происходить после изменения, которое казалось несвязанным. Он исчез после того, как я перезапустил сервер приложений.
источник
Изменение
ModuleName
к'ModuleName'.constantize
решаемой проблеме для меня.источник
Что сработало для меня:
Обновить
config.eager_load = false
доtrue
в
config/environments/development.rb
Ruby 2.6.5
Rails 5.1.6
источник
Иногда ты просто
Перезагрузите ваш сервер,
источник
A copy of X has been removed from the module tree but is still active
на всех страницах, на которых есть ObjectY.embeds X
, и перезапуск сервера действительно работает для этого конкретного случая. Но вы должны отредактировать свой ответ.