使用Ruby/Rails解决"未定义的常量"问题

Mud*_*Mud 13 ruby mime ruby-on-rails rest-client

我有一个Rails项目,其中一个常量在服务请求时在某个时刻被激活.

我正在使用mime/typesrestclient宝石.该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,所以它不是自动加载的.

*呼*

Mud*_*Mud 3

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

在我的配置中:

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 类型,因此不会自动加载。