我读到的关于猴子补丁的一切都说要做这样的事情:
class String
def foo
#your special code
end
end
但我找不到任何有关放置此代码的说明。在rails应用程序中,我可以把它放在我想要的任何疯狂的地方吗?在模块中?一个模型?
我是否需要在我定义monkeypatch的文件中包含一些内容?我是否需要在我想要使用它的地方包含我的monkeypatch?
答案 0 :(得分:10)
此处没有固定规则。从技术上讲,你可以在任何地方打开它(类;并添加你的方法)。我通常会创建一个名为monkey_patches.rb
的特殊文件,并将其放在我的Rails应用程序中的config/initializers
或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
答案 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控制台。否则,它将不会加载新文件。