13

我有一个 Rails 项目,其中一个常量在服务请求时会在某个时候被核对。

我正在使用mime/typesrestclient宝石。该模块定义了一个包含方法restclient的扩展。MIMEtype_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


编辑:修复它!

在我的配置中:

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.closeDispatcher.cleanup_application

修复是先加载mime-types,所以它不会自动加载。

*呼*

4

1 回答 1

3

应要求回答我自己的问题。

在我的配置中:

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

aws-s3库是通过加载mime-typesrequire_library_or_gem,它最终被调用ActiveSupport::Dependencies.autoload_module!,它维护一个名为的表,在调用autoloaded_constants时被 nukedActionController.closeDispatcher.cleanup_application.

修复是首先加载 mime 类型,因此它不会自动加载。

于 2011-07-26T03:24:42.667 回答