如何在Ruby on Rails中进行猴子补丁?

7

让我们用一个真实的例子来说明。

我想要对WillPaginate::LinkRenderer.to_html方法进行猴子补丁。

到目前为止,我尝试过:

  1. 在文件夹lib/monkeys下创建了一个文件:will_paginate_nohtml.rb
  2. 在config/environments.rb中添加代码:在文件末尾加上require 'monkeys/will_paginate_nohtml'
  3. 在will_paginate_nohtml.rb文件中,这是我的代码:

e

module Monkeys::WillPaginateNohtml
  def to_html
    debugger
    super
  end
end

WillPaginate::LinkRenderer.send(:include, Monkeys::WillPaginateNohtml)

但是,不知何故,调试器没有通过。看起来补丁失败了。

非常感谢您的帮助!

4个回答

11

这个怎么样呢:-) @shingana,@kandadaboggu提供的解决方案不起作用,因为这里没有 "super"。你想调用 原始 版本而不是 超级 版本。

module WillPaginate
  class LinkRenderer
    alias_method :to_html_original, :to_html
    def to_html
      debugger
      to_html_original
    end
  end
end

+1 是因为在打补丁时没有 "super",尽管我更喜欢 @vise 的答案来自定义渲染器(并且会有 "super")。 - hurikhan77
我已经有点想念alias_method_chain了,虽然它只消失了大约一个月。 - Matt Briggs
@MattBriggs 你在说什么?截至4.0.2版本,它仍然存在:http://apidock.com/rails/Module/alias_method_chain - Chloe

5
你的问题标题有误导性。坦白地说,我认为你可能只是想自定义will_paginate页面列表结构,这可以通过不同的方式实现。
因此,在你的情况下,正确的方法是扩展渲染器。例如,从初始化程序(通过config/initializers)加载以下内容:
class CustomPaginationRenderer < WillPaginate::LinkRenderer

  def to_html
    # Your custom code, debugger etc
  end

end

然后,要使您的应用程序使用此渲染器,请将以下内容添加到config/environment.rb文件中:
WillPaginate::ViewHelpers.pagination_options[:renderer] = 'CustomPaginationRenderer'

-1

我认为你需要打开这个方法

module WillPaginate
  class LinkRenderer
    def to_html
      debugger
      super
    end
  end
end

-1

试试这个:

module LinkRendererWrapper
  def to_html
    debugger
    super
  end
end

WillPaginate::LinkRenderer.prepend(LinkRendererWrapper)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接