【问题标题】:event trigger system design in railsRails 中的事件触发系统设计
【发布时间】:2012-09-22 07:19:51
【问题描述】:

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

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

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

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

触发方法应该

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

我查看了一些 gem(fnordmetrics,...),但我找不到一个巧妙的实现。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我也想过。我去看看。
    • 我建议不要使用 AS:Notifications,它们是 Rails 不可或缺的一部分,并且由于它们的使用在未来可能会发生变化,因此将应用程序函数绑定为Raisl 内部通知系统的事件跟踪。
    • @Beaks 所以你建议不要使用 ActiveRecord,因为它是他们的内部 ORM?还是反对在 memcached 上使用 Rails.cache 抽象,因为它是由 rails 提供的?
    【解决方案2】:

    我会构建如下内容:

    # 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 的变形模块定义。

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

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多