【问题标题】:How to monkeypatch Ruby properly?如何正确修补 Ruby?
【发布时间】:2011-05-10 19:50:52
【问题描述】:

我正在尝试对标准库的 Net 类中的一行进行猴子补丁。我在项目的 lib 文件夹中创建了一个名为 patch.rb 的文件并添加了这个

module Net
  class HTTP < Protocol
    module HTTPHeader
      def initialize_http_header(initheader)
        @header = {}
        return unless initheader
        initheader.each do |key, value|
          @header[key.downcase] = [value.strip] rescue ""
        end
      end
    end
  end
end

但它不起作用。我这样做对吗? (这与继承层次完全平行。)

编辑:部分问题是我必须将文件放在 initalizers 文件夹中。但仍然看到同样的错误。

【问题讨论】:

  • 你在做require 'lib/patches' 吗?
  • @caley 我以为 lib 文件夹中的所有内容都是在启动时自动加载的。
  • 抱歉,我以为您指的是您创建的 lib 文件夹。
  • @taro:错误是一个 whiny_nil,这是我试图解决的问题。只要我看到错误,这意味着我的补丁没有覆盖原始补丁。

标签: ruby ruby-on-rails-3 monkeypatching


【解决方案1】:

由于lib/ 目录中的内容仅按需加载,因此将此类补丁放入config/initializers/ 可能会更成功,它们会在堆栈初始化后自动加载。

您还可以将扩展的定义折叠成这样的:

module Net::HTTP::HTTPHeader
  # ... (redefined methods) ...
end

【讨论】:

  • 谢谢,塔德曼。我折叠了定义,但执行的代码似乎仍然来自代码源。
  • 很容易对错误的东西进行修补,因此您应该始终仔细检查目标的名称空间。我查看了net/http.rb,它可能应该是Net::HTTPHeader,你正在重新定义方法,而不是Net::HTTP::HTTPHeader
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多