在外部轨道宝石中覆盖功能/视图/控制器的正确方法

时间:2013-08-27 08:29:07

标签: ruby-on-rails ruby rubygems

我正在使用一些框架(blacklight),我需要根据自己的需要进行更改和扩展。也就是说,我需要重新实现一些功能,视图和控制器。我目前所做的是将文件复制到我的工作目录中的匹配路径,并在复制的文件中进行更改。这样,我复制的文件会覆盖gem中的原始文件。当发布新版本的gem时,我可能需要相应地更改我复制的文件。我不喜欢我解决修改宝石问题的方式。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:3)

我根据具体情况了解三种方式。

最简单的是在正确的地方覆盖。例如,您可以在ApplicationController中覆盖Devise的current_user。一些方法适用于模型,助手。只是在正确的地方做到这一点。

第二个是猴子补丁。如果没有好的地方可以覆盖而且没有太多要改变的东西,你可以在应用程序中修补gem的特定方法。通常的做法是将这样的猴子修补程序放在/lib中,完全按照gem的模块名称和挂钩的位置。

第三个是在github上创建自己的gem分支。分叉宝石,在本地克隆它,改变你需要的东西,推。如果gem维护者可以接受你的改变,那就太好了。如果没有,您可以通过在Gemfile中设置它来使用您自己的gem版本

 gem 'some_geg', :git => 'git://github.com/my_repos/some_gem.git'

当main中有更新时,您可以将其合并到您自己的版本中。