繁体   English   中英

如何monkeypatch现有的宝石(Rails引擎)?

[英]How to monkeypatch an existing gem (Rails engine)?

我开始使用Ruby和Rails 3.我想使用Rails引擎(打包为Gem),但它并不像我希望的那样完全正常工作。 我想做一些细微的修改,但不想创建自己的分叉版本。 我认为这是猴子修补变得有用的地方。

作为Ruby的新手(来自PHP背景)猴子修补对我来说是一个新概念。 我将如何修补猴子修补现有的宝石,我将如何组织我的修改? 我正在寻找一些“最佳实践”方法。

这是一个非常广泛的问题,因为你没有提到什么宝石或你想如何修改行为,但......

一般来说,接近这种方法(解决这个问题的一种方法)就是打开宝石。 使用可以打开所有文件的编辑器,以便您可以轻松地从一个文件切换到另一个文件。 查看gem时,找出哪个类包含您要更改的功能。

所以,你去你的测试或spec目录并写一个测试,如:

# Write tests to your API the way you want to write
# your code, not how you expect you *will* write that
# code.

def test_it_spits_out_my_awesome_error_message
  # some setup code
  assert_equal my_obj.spit_out_error_message, "some expected error message"
end

并运行您的测试。 当然,它们会失败,因为您的新功能尚未到位。

现在,假设您的更改位于spit_out_error_message类中的AwesomeAuthentication 您可以在项目中创建一个类 - 可能在lib / awesome_auth.rb或类似的东西中。 在其中,您按照此处的描述执行: Rails 3:仍然使用alias_method_chain? 您还需要阅读:http: //yehudakatz.com/2009/03/06/alias_method_chain-in-models/ ,因为它描述了使用此技术修改现有类(滚动到底部)。

因此,您创建一个新的spit_out_error_message ,如上所述拼凑它并重新运行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM