轨道中的事件触发系统设计

我正在重新设计我的活动源,我已经使用redis和rails实现了逻辑(顺便说一下,这很好用)但我仍然不确定如何创建/触发事件。

在我的第一种方法中,我使用了观察者,其缺点是没有current_user可用。 并且,无论如何使用观察者是一个坏主意:)

我首选的方法是在控制器中创建/触发事件,它应该看起来像:

class UserController < LocationController def invite ... if user.save trigger! UserInvitedEvent, {creator: current_user, ...}, :create .... end end end 

触发方法应该

  • 使用一些参数创建UserInvitedEvent。 (:create可以是默认选项)
  • 可以停用(例如停用以进行测试)
  • 可以用例如resque执行

我看了一些gem(fnordmetrics,…),但我找不到一个光滑的实现。

我会构建如下内容:

 # 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 ,并提供命名空间的可能性,例如Track(:'users/invited') 。 其语义由ActiveSupport的变形模块定义。

我认为这应该是你的跟踪代码的一个不错的开始,我一直在一个项目取得了很大的成功,直到现在!

使用(新)rails ActiveSupport::NotificationsActiveSupport::Notifications系统,您可以完全ActiveSupport::Notifications通知和实际Feed构造。

请参阅http://railscasts.com/episodes/249-notifications-in-rails-3?view=asciicast