ruby-on-rails - Ruby/Rails 神秘的 "undefined constant"问题

标签 ruby-on-rails ruby mime rest-client

我有一个 Rails 项目,其中一个常量在处理请求时在某个时刻被破坏。

我正在使用 mime/typesrestclient 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/

相关文章:

ruby - 使用 Nokogiri 如何将 Node 对象内容插入到 XML::Builder 结构中?

ruby-on-rails - 在 Ruby 中 Active Record 搜索特定文本模式

css - @import 的 SASS/SCSS 自定义 css 表

ruby-on-rails - 如何通过提取另一个模型的名称来确定模型?

java - 如何将 MimeBodyPart ContentType 设置为 "text/html"?

php - CSS 样式表无法连接到我的 HTML 登录页面(未加载,因为它的 MIME 类型 “text/html” 不是 “text/css” )

ruby-on-rails - 在 CentOS 7 上安装 Jekyll 错误

ruby-on-rails - 带有模块和命名空间的 form_for

ruby-on-rails - 如何在 Rails3 的 config/initializers 下捕获所有 ActiveRecord::Errors

javascript - 使用 Javascript 解析电子邮件源的 text/html 部分