在我的 Rails 应用程序中,我需要在模块中使用 ApplicationController 中定义的方法。该模块还需要可供所有控制器/助手访问。我不确定让模块访问此方法的最佳方法是什么。我认为有一种方法可以通过包装模块然后将其包含到 ApplicationController 中来实现。
我还想保留命名空间,而不是将模块方法直接包含在控制器中。例如 controller.Module.foo 而不仅仅是 controller.foo
这就是我想要做的:
module Analytics
module Events
extend self
def create_event name
# do some stuff
controller_method name
end
end
end
class ApplicationController < ActionController::Base
include Analytics
def controller_method
# ...
end
def some_other_method
Events.create_event :test
end
end
现在我知道我可以向 Analytics 模块添加一个 self.included 方法,它为我提供传入的基础对象,但我不知道如何在 KissMetrics 模块中使用该基础。
这是可能的还是有更好的方法来做到这一点?
编辑:
为了进一步澄清,我使用了一个扩展/包含在 ActionController::Base 中的 gem。请参阅此脚本的底部。然后在 ApplicationController 中配置这个库。我想要做的就是拥有一个包含使用此 gem 的已定义事件的模块。它使我更容易在我的所有控制器中拥有一致的事件,例如
module Events
def sign_up_event
analytical.event "sign up" # calls the library that was loaded into the app controller
end
end
# in some controller
Events.sign_up_event
# instead of this, which is totally usable but not DRY
analytical.event "sign up"