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

Мистификация "undefined константа" с Ruby/Rails

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

Я использую драгоценные камни mime/types и restclient. Модуль 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; как последний мог быть убит, но не первый?


EDIT: FIXED IT!

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

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

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

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

* гммы *

4b9b3361

Ответ 1

Отвечая на мой вопрос по запросу.

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

config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"  
config.gem 'mime-types', :lib => 'mime/types'
Библиотека

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

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