Rails - 不能修补wicked_pdf gem

时间:2016-05-03 22:39:49

标签: ruby ruby-on-rails-4 wicked-pdf

我正在尝试修补wicked_pdf gem,但我的补丁无法识别。

如果我在gem的本地副本中进入源代码并修改WickedPdf类的#print_command method,那么当我查看pdf时,我的修改会反映在日志中。

# local/gem/path/lib/wicked_pdf.rb
def print_command(cmd)
  puts "\n\nthis is my modification\n\n" # appears in logs
end

然而,当我尝试实现与猴子补丁相同的想法时,在初始化器中,假设没有反映这种修改。

# config/initializers/wicked_pdf.rb
module WickedPdfExtension
  def print_command(cmd)
    puts "\n\nthis is my modification\n\n" # does not appear in logs
  end
end

WickedPdf.include(WickedPdfExtension)

我正在检查WickedPdf类在我扩展它时是否存在,并且我已经确认在WickedPdf类中使用其他方法(公共和私有)。为什么我的猴子补丁无效?

2 个答案:

答案 0 :(得分:3)

WickedPdf#print_command直接在班级WickedPdf中定义(请参阅the source code),因此会隐藏班级#print_command d中定义的任何include 。要覆盖它的行为,如果使用Ruby> = 2.0.0,则可以使用Module#prepend,否则使用别名方法链。当然,无论您使用的是哪个版本的Ruby,都可以随时打开类WickedPdf并重新定义该方法。

使用Module#prepend

module WickedPdfExtension
  def print_command(cmd)
    puts "\n\nthis is my modification\n\n"
  end
end

WickedPdf.prepend(WickedPdfExtension)

使用别名方法链

module WickedPdfExtension
  extends ActiveSupport::Concern

  included do
    def print_command_with_modification(cmd)
      puts "\n\nthis is my modification\n\n"
    end

    alias_method_chain :print_command, :modification
  end
end

WickedPdf.include(WickedPdfExtension)

答案 1 :(得分:1)

我认为你需要打开这个类:

class WickedPdf
  def print_command(cmd)
    puts "\n\nthis is my modification\n\n" 
  end
end