为什么 "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
我在 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