首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails中事件触发系统的设计

rails中事件触发系统的设计
EN

Stack Overflow用户
提问于 2012-10-01 12:32:21
回答 2查看 1.7K关注 0票数 0

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

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

我喜欢的方法是在控制器中创建/触发事件,这些事件应该如下所示:

代码语言:javascript
复制
class UserController < LocationController
  def invite
    ...
    if user.save
      trigger! UserInvitedEvent, {creator: current_user, ...}, :create
      ....
    end
  end
end

触发方法应该

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

我看了一些宝石(指南针.)但我找不到一个巧妙的实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-01 13:19:15

我会构建如下内容:

代码语言:javascript
复制
# 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黑客让我们拥有全局的Track()函数,并将其导出到全局命名空间,您(关键是该方法是复制的到全局范围,因此它实际上是全局的,在这里阅读更多:function)

然后,我们启用除了生产之外的所有模式的跟踪,我们在Rails中调用event.classify.constantize,它应该将类似:user_invited_event的东西转换为UserInvitedEvent,并提供了名称空间的可能性,例如Track(:'users/invited')。它的语义由ActiveSupport的拐点模块定义。

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-01 13:23:40

使用(新的) rails内部化和ActiveSupport::Notifications系统,您可以完全解耦通知和实际的提要结构。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12673330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档