[英]Access controller method in a Ruby module
在我的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"
就我所知,您不应从lib中调用控制器动作,而应从相反的角度进行。
我建议制作一个库,因为我不知道您到底要构建什么,所以我建立了一个示例:
在lib / analytics.rb中
class Analytics
def initialize(object_id, event_id)
# insert object to event relation logic here
@object = Object.find(object_id)
@event = Event.find(event_id)
end
def add_instance_method
# add logic for instantiated Analytics object
@object.event_collection.create(event_id: @event.id)
end
def self.check_class_method?(object_id, event_id)
# check logic for Analytic Class taking 2 arguments
@object = Object.find(object_id)
@event = event.find(event_id)
@object.events.include?(@event)
# return true/false
end
end
所以现在在您的控制器中:
def action
@object = Object.find(params[:id])
@event = Event.find_by_identifier("logged_in")
unless Analytics.check_class_method?(@object_id, @event_id)
analytic = Analytics.new(@object.id, @event.id)
raise "Failed" unless analytic.add_instance_method
end
end
决定通过将模块更改为类并在ApplicationController的before_filter回调中对其进行实例化来解决此问题。 我将初始化的分析对象传递给它,一切都很好。 本来希望使用模块,但这可以解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.