我正在尝试修补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
类中使用其他方法(公共和私有)。为什么我的猴子补丁无效?
答案 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