我有一个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模块时,它会在stringify_headers中的行显示中抛出一个异常。
NoMethodError, message: undefined method `type_for_extension' for MIME::Types:Class**这怎么可能?type_for_extension与stringify_headers在同一个文件中定义;后者怎么会被核弹,而前者却没有?
编辑:固定IT!
在我的配置中:
config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"
config.gem 'mime-types', :lib => 'mime/types'aws-s3通过require_library_or_gem加载mime-types,后者最终调用ActiveSupport::Dependencies.autoload_module!,后者维护一个名为autoloaded_constants的表,当ActionController.close调用Dispatcher.cleanup_application时,该表将被核化。
修正是先加载mime-types,所以它不是自动加载的。
*呜呜*
发布于 2011-07-26 03:24:42
按要求回答我自己的问题。
在我的配置中:
config.gem "aws-s3", :version => ">= 0.6.2", :lib => "aws/s3"
config.gem 'mime-types', :lib => 'mime/types'aws-s3库通过require_library_or_gem加载mime-types,后者最终调用了ActiveSupport::Dependencies.autoload_module!,后者维护了一个名为autoloaded_constants的表,当ActionController.close调用Dispatcher.cleanup_application.时,该表将被核化。
修正是先加载mime类型,所以它不是自动加载的。
https://stackoverflow.com/questions/6720683
复制相似问题