Загадочная проблема с «неопределенной константой» с помощью Ruby / Rails

У меня есть проект Rails, в котором используется константа был атакован в какой-то момент во время обслуживания запроса.

Я использую mime / types и restclient g ems. Модуль restclient определяет расширение для MIME , которое содержит метод type_for_extension .

module RestClient
    ...
    def stringify_headers headers
      result[key] = target_values.map { |ext| MIME::Types.type_for_extension(ext.to_s.strip) }.join(', ')
      ...
    end
  end
end

module MIME
  class Types
    def type_for_extension ext
      candidates = @extension_index[ext]
      candidates.empty? ? ext : candidates[0].content_type
    end
    class << self
      def type_for_extension ext
        @__types__.type_for_extension ext
      end
    end
  end
end

Я могу получить доступ к MIME :: Types.type_for_extension при моем первом вызове данного действия контроллера. При втором вызове его больше нет.

Я все еще могу использовать MIME :: Types.type_for , но добавленный метод просто исчез, поэтому, когда я пытаюсь использовать модуль RestClient, он выдает исключение в строке showin в stringify_headers :

NoMethodError, message: undefined method `type_for_extension' for MIME::Types:Class

** Как такое возможно? type_for_extension определен в том же файле , что и stringify_headers ; как последний мог получить ядерный удар, но не первый?


РЕДАКТИРОВАТЬ: ИСПРАВЛЕНО!

В моей конфигурации:

config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"  
config.gem 'mime-types', :lib => 'mime/types'

aws-s3 загружал mime-типы через require_library_or_gem , который в конечном итоге вызвал ActiveSupport :: Dependencies.autoload_module! , который поддерживает таблицу с именем autoloaded_constants , которая сбрасывается , когда ActionController.close вызывает Dispatcher.cleanup_application .

Исправление заключалось в том, чтобы сначала загрузить mime-типов , чтобы он не загружался автоматически.

* вот *

13
задан Mud 17 July 2011 в 03:31
поделиться