Копия 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 90

3 ответа:

Tenant Это своего рода отвлекающий маневр - ошибка произойдет, если вы ссылаетесь на какой-либо бит приложения, который должен быть загружен rails' const_missing трюк.

проблема в том, что вы берете что-то перезагружаемое (ваш модуль), а затем включаете его в что-то не перегружаемое (ActiveRecord::Base или, как в вашем предыдущем примере ActionMailer::Base). В какой-то момент ваш код перезагружается, и теперь ActiveRecord все еще имеет этот модуль, включенный в него, хотя rails думает, что он его выгрузил. Ошибка возникает, когда вы ссылаетесь на арендатора, потому что это заставляет rails запускать его const_missing крючки, чтобы узнать, откуда должен быть загружен клиент, и этот код волнуется, потому что модуль, с которого начинается постоянный поиск, не должен быть там.

есть 3 возможных решения:

  1. прекратите включать ваш модуль в не загружаемые классы - либо включите в отдельные модели, контроллеры по мере необходимости, либо создайте абстрактный базовый класс и включите модуль в там.

  2. сделайте этот модуль не перезагружаемым, сохранив его где-то, что не находится в autoload_paths (вам придется требовать его явно, так как rails больше не будет загружать его волшебно для вас)

  3. изменение арендатора на:: Tenant (Object.const_missing будет вызван, а не Tenant.const_missing)

изменение ModuleName до :: ModuleName работал для меня.

Не уверен, что это поможет кому-нибудь, но у меня это внезапно началось после изменения, которое казалось несвязанным. Он ушел после того, как я перезапустил сервер приложений.