猴子修补时将代码放在哪里

Where to put code when monkey patching

我读到的关于猴子补丁的所有内容都说要做这样的事情:

class String
  def foo
    #your special code 
  end
end

但我找不到关于将此代码放在哪里的任何说明。在 rails 应用程序中,我可以把它放在我想要的任何疯狂的地方吗?在模块中?一个模型?

我是否需要在定义 monkeypatch 的文件中包含一些内容?我需要在任何我想使用它的地方包含我的 monkeypatch 吗?

这个没有固定规则。从技术上讲,您可以在任何地方打开它(class;并添加您的方法)。我通常会制作一个名为 monkey_patches.rb 的特殊文件,并将其放在 config/initializers 或我的 Rails 应用程序的 misc 文件夹中,这样如果出现冲突我就知道去哪里查找。

另外,我建议使用 Module 来包裹猴子补丁。查看 3 ways to monkey patch without making a mess 了解更多信息。

他的例子:

module CoreExtensions
  module DateTime
    module BusinessDays
      def weekday?
        !sunday? && !saturday?
      end
    end
  end
end

DateTime.include CoreExtensions::DateTime::BusinessDays

我使用了 Justin Weiss 在 3 Ways to Monkey-Patch Without Making a Mess

中描述的以下技术

例如,在 vanilla Ruby 中,gem,您在需要的某个文件中定义一个模块,然后 include (or extend) 将模块放入所需的 class .

module StringMonkeypatch
  def foo
    #your special code 
  end
end

String.include StringMonkeypatch

在 Rails 中时,您可能希望在自动加载的地方定义模块(查找 autoload_paths)并遵循 Rails 的命名约定。

例如,如果 monkeypatching Sidekiq::Testing gem class 你应该镜像文件结构。

# in /app/<something telling>/sidekiq/testing/monkeypatch.rb
module Sidekiq::Testing::Monkeypatch
  def foo
    #your special code 
  end
end

# in /config/environment.rb, at the bootom
Sidekiq::Testing.include Sidekiq::Testing::Monkeypatch

只是插话,因为我花了很长时间才弄清楚这个问题,因为很少有解决方案奏效。

• 我不得不使用普通的旧要求。我把它放在 config/application.rb 文件中。如果您像某些人建议的那样将文件放在应用程序目录中,该文件不会自动为我加载。不知道为什么。

patching_file_path = File.expand_path("./lib", Dir.pwd) Dir[patching_file_path+'/*.rb'].each {|file| require file }

• 我还在尝试请求的文件中放置了一个临时文件 puts "I'm Working!,这样我就可以检查控制台以查看它是否正在加载。

• 此外,如果您正在使用 spring 加载程序,则在启动控制台之前,您应该在启动 rails 控制台之前在终端中执行 bin/spring stop。否则,它不会加载新文件。