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

时间:2012-10-01 12:32:22

标签: ruby-on-rails ruby

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

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

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

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

触发方法

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

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

2 个答案:

答案 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