У меня есть проект 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-типов
, чтобы он не загружался автоматически.
* вот *