2012-10-01 113 views
0

我正在重新設計我的活動飼料,我已經用redis和rails實現了邏輯(很好用的方式),但我仍然不確定如何創建/觸發事件。事件觸發器系統設計在軌道上

在我的第一個方法中,我使用了observer,它的缺點是沒有current_user可用。並且,使用觀察者是一個壞主意,反正:)

我的首選方法是創建/觸發控制器中的事件,這應該是某事像:

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

觸發方法應該

  • 用一些參數創建UserInvitedEvent。 (:create可以是默認選項)
  • 可以被停用(例如,停用以進行測試)
  • 可以用例如, resque

我看了一些寶石(fnordmetrics,...),但我找不到一個漂亮的實現。

回答

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黑客讓我們在全球擁有的Track()功能,並出口到全局命名空間,您(關鍵的一點是,該方法是在全球範圍內,所以它的有效的全球,在這裏閱讀更多:http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-module_function

然後我們啓用,除了生產的所有模式的跟蹤,我們稱之爲event.classify.constantize Rails中應該把類似:user_invited_event轉換爲UserInvitedEvent,並提供命名空間的可能性,例如Track(:'users/invited')。它的語義由ActiveSupport的變形模塊定義。

我認爲這應該是一個體面的開始您的跟蹤代碼我一直在使用,在一個項目中有很多成功,直到現在!

+0

真棒:)我喜歡那樣。 – fluxsaas

1

通過(新)導軌裝置和ActiveSupport::Notifications系統,您可以完全分離通知和實際進給結構。

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

+0

是的,我也想過這個。我會檢查出來。 – fluxsaas

+0

我會反對AS:Notifications,它們是Rails的一個組成部分,因爲它們的使用情況可能會在將來發生變化,所以將事件跟蹤等應用程序函數綁定到Raisl內部通知將是愚蠢的系統。 –

+0

@Beaks,所以你建議反對ActiveRecord,因爲它是他們的內部ORM?或者反對在memcached上使用Rails.cache抽象,因爲它是由rails提供的? – rewritten