1

Facebook が提供するような通知システムを実装するための gem として、private_pub を使用しています。そのために、ビュー内のチャネルにサブスクライブし、さまざまな場所 (異なるコントローラー) から公開しています。

何が起こっているのかというと、1 つのサブスクリプションで多くのパブリッシュを取得することがあります。なぜこれが起こるのかについて何か考えがありますか?

私の最初の疑いは、通知メソッドを何度も呼び出している可能性があるということでした (ある種のループまたは何かで、しかし、1 回しか呼び出されていないことがわかります。したがって、問題は pub/sub の間のどこかにあるに違いないと思いますほとんどの場合、ビューに通知するときに何か間違ったことをしているためです。

次に、実装の一部を紹介します。

私のウェブサイトの _header.html.erb パーシャルで、次のようにユーザーの通知チャネルを購読します。

たとえば、私の friends_controller では、友人を追加するときに、通知を表示するための html を生成し、次のように通知を前に付けて jquery を公開します。

html_text = render_to_string(:partial => '通知/通知', :locals => {通知: 通知}, :formats => [:html]).squish jquery = "$('#notifications_" + user.id.to_s + "').prepend('#{html_text}');" PrivatePub.publish_to("/notifications/" + user.id.to_s, jquery)

長文で申し訳ありませんが、どなたかお力添えいただければ幸いです。前もって感謝します。

ところで、Ruby 2.0.0p247 で Rails 4.0.0 を実行しています。

4

3 に答える 3

2

古い質問であることは承知していますが、まだこの問題に苦しんでいる人もいるかもしれません。

私の場合、subcribe_toメソッドが AJAX 経由で読み込まれたタブ内にあったため、同じチャンネルに複数回サブスクライブしていました。そのため、ページをリロードせずにそのタブを選択するたびに、同じチャネルに再度登録publish_toされ、そのタブを選択した回数と同じ数の実行が発生しました。

これは、直面しているシナリオとまったく同じではないかもしれませんが、このソリューションはニーズに非常に適している可能性があります。

この問題に対処するために私が行ったことは、クラスprivate_pub/lib/private_pub/view_helpers.rbとメソッドsubscribe_toを次のものでオーバーライドすることです。

module PrivatePub
  module ViewHelpers

    # Subscribe the client to the given channel. This generates
    # some JavaScript calling PrivatePub.sign with the subscription
    # options.
    def subscribe_to(channel)
      subscription = PrivatePub.subscription(:channel => channel)
      content_tag "script", :type => "text/javascript" do
        raw(
          "if(typeof PrivatePub.subscriptions['#{channel}'] === 'undefined') {
            PrivatePub.sign(#{subscription.to_json});
          }")
      end
    end
  end
end

私が変更したのは、サブスクリプション オブジェクトにチャネルが既に存在するかどうかを確認するステートメントをsubscribe_to追加することによって、メソッドが呼び出されたときに html に埋め込まれた JavaScript コードです。if存在しない場合は購読できますが、存在しない場合は購読できません。

raw(
    "if(typeof PrivatePub.subscriptions['#{channel}'] === 'undefined') {
       PrivatePub.sign(#{subscription.to_json})
     }")

お役に立てれば!

于 2016-02-19T15:35:15.407 に答える