为什么 "include" 没有为我的模块使用我的猴子路径方法?

Why is "include" not using my monkey-pathced method for my module?

我在 Rails 6.1.4.4 上使用 Ruby。我想覆盖 gem 中的方法,其签名是 this

module Juixe
  module Acts
    module Commentable
      module ClassMethods
        def acts_as_commentable(*args)
        …
       end
      end
    end
  end
end

所以我尝试创建一个文件 lib/ext/acts_as_commentable_extensions.rb,并包含此代码

require 'acts_as_commentable'

module GemExtensions
  module Commentable
    def hello
      print "hello\n"
    end

    def acts_as_commentable(*args)
      abcdef
    end
  end
end

module Juixe
  module Acts
    module Commentable
      module ClassMethods
        include GemExtensions::Commentable
      end
    end
  end
end

Juixe::Acts::Commentable::ClassMethods.instance_method(:hello).source.display
Juixe::Acts::Commentable::ClassMethods.instance_method(:acts_as_commentable).source.display

虽然第一条语句从我的新方法“hello”打印出正确的源代码,但第二条语句从原始 gem 打印出旧源代码而不是我的新代码。如何用我自己的代码覆盖此方法?

尝试prepend GemExtensions::Commentable而不是include,这将使Ruby首先在前置模块中搜索方法。更多解释在这里 https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073