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_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 の屈折モジュールによって定義されます。

これは、これまで多くの成功を収めてきたプロジェクトで使用してきたトラッキング コードの適切なスタートになると思います。

于 2012-10-01T13:19:15.773 に答える
1

(新しい) Rails の実装とActiveSupport::Notificationsシステムを使用すると、通知と実際のフィードの構築を完全に切り離すことができます。

http://railscasts.com/episodes/249-notifications-in-rails-3?view=asciicastを参照してください。

于 2012-10-01T13:23:40.190 に答える