猴子修补时放置代码的位置

时间:2017-01-17 19:29:03

标签: ruby-on-rails ruby monkeypatching

我读到的关于猴子补丁的一切都说要做这样的事情:

class String
  def foo
    #your special code 
  end
end

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

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

3 个答案:

答案 0 :(得分:10)

此处没有固定规则。从技术上讲,你可以在任何地方打开它(类;并添加你的方法)。我通常会创建一个名为monkey_patches.rb的特殊文件,并将其放在我的Rails应用程序中的config/initializersmisc文件夹中,这样如果发生冲突我知道该去哪里看。

另外我建议使用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

答案 1 :(得分:1)

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

中描述的以下技术

例如,在vanilla Ruby中,你需要在某个文件中定义一个模块,然后将include (or extend)模块定义到所需的类中。

module StringMonkeypatch
  def foo
    #your special code 
  end
end

String.include StringMonkeypatch

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

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

# 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

答案 2 :(得分:0)

只是插话,因为几乎没有解决方案使我花了很长时间才弄清楚这一点。

•我不得不使用普通的旧需求。我将其放在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 Loader,则在启动控制台之前,应在终端中执行bin/spring stop,然后再启动Rails控制台。否则,它将不会加载新文件。