0

我正在重新设计我的活动提要,我已经用 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,...),但我找不到一个巧妙的实现。

4

2 回答 2

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_functionhack让我们全局拥有函数,并将其Track()导出到全局命名空间,你(关键是该方法被复制到全局范围,所以它实际上是全局的,在这里阅读更多:http://www.ruby-doc .org/core-1.9.3/Module.html#method-i-module_function )

然后我们为除生产之外的所有模式启用跟踪,我们调用event.classify.constantizeRails 应该变成类似的东西:user_invited_eventUserInvitedEvent并提供命名空间的可能性,例如Track(:'users/invited'). 其语义由 ActiveSupport 的变形模块定义。

我认为这应该是您跟踪代码的一个不错的开始,到目前为止,我一直在一个项目中使用它,并取得了很大的成功!

于 2012-10-01T13:19:15.773 回答
1

使用(新的)rails 仪表和ActiveSupport::Notifications系统,您可以将通知和实际的 feed 结构完全分离。

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

于 2012-10-01T13:23:40.190 回答