我正在重新设计我的活动源,我已经使用redis和rails实现了逻辑(顺便说一下,这很好用)但我仍然不确定如何创建/触发事件。
在我的第一种方法中,我使用了观察者,它的缺点是没有current_user可用。并且,无论如何使用观察者是一个坏主意:))
我首选的方法是在控制器中创建/触发事件,它应该看起来像:
class UserController < LocationController
def invite
...
if user.save
trigger! UserInvitedEvent, {creator: current_user, ...}, :create
....
end
end
end
触发方法
我看了一些宝石(fnordmetrics,...),但我找不到一个光滑的实现。
答案 0 :(得分:1)
我会建立如下内容:
# config/initializers/event_tracking.rb
modlue EventTracking
attr_accessor :enabled
def enable
@enabled = true
end
def disable
@enabled = false
end
module_function
def Track(event, options)
if EventTracking.enabled
event.classify.constantize.new(options)
end
end
end
include EventTracking
EventTracking.enable unless Rails.env.test?
module_function
hack让我们全局拥有Track()
函数,并将其导出到全局命名空间,你(关键是该方法被复制到全局范围,因此它实际上是全局的,请在此处阅读更多内容:http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-module_function)
然后我们启用除生产之外的所有模式的跟踪,我们在Rails中调用event.classify.constantize
,将:user_invited_event
转换为UserInvitedEvent
,并提供命名空间的可能性,例如{{ 1}}。其语义由ActiveSupport的变形模块定义。
我认为这应该是您的跟踪代码的一个不错的开端,我一直在一个项目中使用它,直到现在已经取得了很大的成功!
答案 1 :(得分:1)
使用(新)导轨检测和ActiveSupport::Notifications
系统,您可以完全解除通知和实际饲料结构。
请参阅http://railscasts.com/episodes/249-notifications-in-rails-3?view=asciicast