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-s3mime-types库通过加载require_library_or_gem,最终调用ActiveSupport::Dependencies.autoload_module!它维护一个名为的表,该表在调用autoloaded_constants时被破坏ActionController.closeDispatcher.cleanup_application.
修复方法是首先加载 mime 类型,因此不会自动加载。