新手问题 给 Gem 里的 class 修改功能或字段的解决方案

neversion · 2014年05月29日 · 最后由 meeasyhappy 回复于 2014年05月30日 · 2349 次阅读

项目里用到一 gem,具体需求是要修改这个 gem 内定义的一个 class 的功能和字段。有什么比较好的解决方案? 目前比较粗暴的想法是:把整个 gem 弄到本地,修改,然后在 Gemfile 内直接引用这个本地的修改版本。 这个方式比较麻烦的是如果 gem 更新的话就只能重新在写一遍修改了...

直接 monkey patch 啊。。。

直接在项目里边打开类进行重写。可以参考一下 Spree 或者 RefineryCMS 的 decorator 机制。

如果你修改的是别人的 Bug,或者增加别人也有可能的功能,那正确的方式是:

GitHub 找到这个 Gem 的项目 -> Fork -> Checkout Branch -> Commit -> 提交 Pull Request

在别人接受你的 Pull Request 之前,你可以在 Gemfile 里面这样用:

gem 'foo', github: 'your-github-name/foo'

Ruby 社区贡献靠你啦!不建议 Monkey Patch,人人都这么做,社区如何进步?!

#3 楼 @huacnlee 不是修改 bug,是修改到符合自己的需求。 #1 楼 @Kabie 如果直接 monkey patch 修改的话,原来 gem 中调用该 class 的行为也会随之改变吗?

#4 楼 @huacnlee 可以把 patch 放到单独的 gem 里嘛。。。我只是说可以直接 override 行为

@neversion 一般做法是: 添加 代码 config/initailizers/xxxx.rb 进行修改 gem 一些行为,实现定制。

#7 楼 @meeasyhappy 能够详细介绍下这个方法?

@neversion 就是 打开类,添加 或 覆盖 你想要的方法。具体还是看你的需求了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号