Копия xxx была удалена из дерева модулей, но все еще активна
Я уверен, что ошибка не имеет ничего общего с фактическим содержанием TenantIdLoader
модуль. Вместо этого, это имеет какое-то отношение к ActiveSupport
зависимостей.
Я не могу пройти мимо этой ошибки. Из того что я читал, это потому, что либо ActiveRecord::Base
перезагружается или Company::TenantIdLoader
перезагружается, и это как-то не сообщается. Помогите, пожалуйста! Я бы очень хотел получить возможность перейти на Rails 4.2.
EDIT
теперь я узнал, что это потому, что я ссылаюсь Tenant
который автоматически перезагружается. Мне нужно быть в состоянии на самом деле ссылаться на класс, хотя, так кто-нибудь знает, как обойти это?
config / application.РБ
config.autoload_paths += %W( #{config.root}/lib/company )
файл config/инициализаторы/компании.РБ
ActionMailer::Base.send(:include, Company::TenantIdLoader)
lib / company / tenant_id_loader.РБ
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 ответа:
Tenant
Это своего рода отвлекающий маневр - ошибка произойдет, если вы ссылаетесь на какой-либо бит приложения, который должен быть загружен rails'const_missing
трюк.проблема в том, что вы берете что-то перезагружаемое (ваш модуль), а затем включаете его в что-то не перегружаемое (
ActiveRecord::Base
или, как в вашем предыдущем примереActionMailer::Base
). В какой-то момент ваш код перезагружается, и теперь ActiveRecord все еще имеет этот модуль, включенный в него, хотя rails думает, что он его выгрузил. Ошибка возникает, когда вы ссылаетесь на арендатора, потому что это заставляет rails запускать егоconst_missing
крючки, чтобы узнать, откуда должен быть загружен клиент, и этот код волнуется, потому что модуль, с которого начинается постоянный поиск, не должен быть там.есть 3 возможных решения:
прекратите включать ваш модуль в не загружаемые классы - либо включите в отдельные модели, контроллеры по мере необходимости, либо создайте абстрактный базовый класс и включите модуль в там.
сделайте этот модуль не перезагружаемым, сохранив его где-то, что не находится в autoload_paths (вам придется требовать его явно, так как rails больше не будет загружать его волшебно для вас)
изменение арендатора на:: Tenant (
Object.const_missing
будет вызван, а неTenant.const_missing
)