我有一个 Rails 项目,其中一个常量在处理请求时在某个时刻被破坏。
我正在使用 mime/types
和 restclient
gem。 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
我可以在第一次调用给定 Controller 操作时访问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
正在通过 require_library_or_gem
加载 mime-types
,最终调用 ActiveSupport::Dependencies.autoload_module!
维护一个名为 autoloaded_constants
的表,当 ActionController.close
调用 Dispatcher.cleanup_application
时,该表nuked。
修复是首先加载 mime-types
,因此它不会自动加载。
*呼*
最佳答案
应要求回答我自己的问题。
在我的配置中:
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 类型,因此它不是自动加载的。
关于ruby-on-rails - Ruby/Rails 神秘的 "undefined constant"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6720683/