我寫了這個模塊:與類如何包括重新定義的方法包括
module Hooks
module ExecutionHooks
def before_action(hook, *method_names)
method_names.each do |method_name|
method = method(method_name)
define_singleton_method(method_name) do |*args, &block|
method(hook).call(*args)
method.call(*args, &block)
end
end
end
end
def self.included(base)
base.send(:extend, Hooks::ExecutionHooks)
end
end
這個模塊允許其他模塊或類來定義一個鉤子應該類似於Rails的一個before_action
特定的動作之前被調用。 然後,我包括在我HTTParty模塊該模塊:
module HTTParty
include Hooks
before_action :perform_action, :get
def self.perform_action
puts "performed"
end
end
有一類,其中包括了HTTParty模塊:
class TestClient
include HTTParty
...
end
當我嘗試訪問TestClient的的get
方法,它不致電perform_action
。這裏包含的get
方法是原始方法,而不是重新定義的方法。
有沒有辦法在TestClient類中包含重新定義的get
方法?
我認爲你的代碼看起來非常接近目標,但更現代的方法是在'Module#prepend'中使用'super'。 – sawa
我對Ruby很新。請解釋一下,我應該在代碼的哪一點使用Module#prepend? – crashstorm
請先閱讀'prepend'文檔,如果需要進行進一步研究並進行實驗,然後再要求我們編寫更多文檔。 –