Подтвердить что ты не робот

Копия xxx была удалена из дерева модулей, но все еще активна

Я уверен, что ошибка не имеет ничего общего с фактическим содержимым модуля 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 table has a tenant_id
      def tenant_dependent?
        self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id')
      end

    end

  end
end
4b9b3361

Ответ 1

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

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

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

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

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

  • Замена арендатора на: Арендатор (Object.const_missing будет вызываться, а не Tenant.const_missing)

Ответ 2

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

Ответ 3

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

Ответ 4

Изменение ModuleName на 'ModuleName'.constantize решило проблему для меня.

Ответ 5

Иногда ты просто

Перезагрузите ваш сервер,