Mud*_*Mud 13 ruby mime ruby-on-rails rest-client
我有一个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
Run Code Online (Sandbox Code Playgroud)
我可以MIME::Types.type_for_extension
在第一次调用给定的控制器动作时访问.在第二次调用时,它已经消失了.
我仍然可以使用MIME::Types.type_for
,但添加的方法已经消失了,所以当我尝试使用RestClient模块时,它会在showin的行中引发异常stringify_headers
:
NoMethodError, message: undefined method `type_for_extension' for MIME::Types:Class
Run Code Online (Sandbox Code Playgroud)
**这怎么可能?type_for_extension
在同一个文件中定义stringify_headers
; 怎么可能后者得到核武器而不是前者?
编辑:固定它!
在我的配置中:
config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"
config.gem 'mime-types', :lib => 'mime/types'
Run Code Online (Sandbox Code Playgroud)
aws-s3
装载了mime-types
通过require_library_or_gem
,这最终调用ActiveSupport::Dependencies.autoload_module!
它保持一个称为表autoloaded_constants
被核爆时ActionController.close
调用Dispatcher.cleanup_application
.
修复是先加载mime-types
,所以它不是自动加载的.
*呼*
按要求回答我自己的问题。
在我的配置中:
config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"
config.gem 'mime-types', :lib => 'mime/types'
Run Code Online (Sandbox Code Playgroud)
aws-s3
mime-types
库通过加载require_library_or_gem
,最终调用ActiveSupport::Dependencies.autoload_module!
它维护一个名为的表,该表在调用autoloaded_constants
时被破坏ActionController.close
Dispatcher.cleanup_application.
修复方法是首先加载 mime 类型,因此不会自动加载。