ruby-on-rails – 使用Ruby / Rails启发“未定义的常量”问题

我有一个Rails项目,其中一个常数在某个时候被提供请求.

我正在使用mime / types和restclient gems. 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

**这怎么可能?与stringify_headers在同一文件中定义的type_for_extension;后者怎么可以得到忍者,但不是前者?

编辑:固定!

在我的配置:

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!当ActionController.close调用Dispatcher.cleanup_application时,它维护一个名为autoloaded_constants的表.

修复是首先加载mime类型,所以它不是自动加载的.

*呼*

解决方法

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

在我的配置:

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

aws-s3库正在加载mime-types通过require_library_or_gem,所以它不是自动加载的.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...