在 Blacklight 中覆盖模块

Overriding Modules in Blacklight

我想覆盖文件 document_presenter.rb 中定义的一些方法。我怎样才能做到这一点?该模块在 Blacklight gem 的 "lib" 目录中定义。

有没有简单的方法来做到这一点?我是 Ruby 和 Rails 的新手(来自纯粹的 Java 背景),所以这有点困难。

谢谢。

听起来你在谈论猴子修补背光中的方法gem。您可能想要 read this post 解释更多关于猴子补丁的信息 - 以及如何不严重破坏东西!

在Ruby中,可以随时打开一个已有的class,用class关键字,用def关键字重新定义原来的方法。

class DocumentPresenter
  def method_you_want_to_override
    # Your code here.
  end
end

例如,您可以将上述代码放入您的 lib 文件夹中:

lib/document_presenter.rb

参见 this answer 回复:自动加载 lib 文件夹中的文件。

完成后,每当您调用在 DocumentPresenter class 实例上猴子修补的方法时,Ruby 解释器将 运行 您的代码. 不推荐这样做,因为它会产生危险且不可预测的结果,根据我链接到的博客 post。

在 Ruby 2 中,更好的做法是使用 Refinements