8

Rails アプリでは、プッシュ通知 (チャット用) に Faye (Rack アダプター) を使用しました。

Faye を別のユースケース (より多くのプッシュ通知) に使用したいのですが、理解できないようです。

私のアプリでは、バックグラウンド ジョブからモデルを作成できるため、モデルが作成されたときにビューの 1 つ (インデックス アクションなど) を更新したいと考えています。

そのようです:

アプリ/モデル/post.rb

class Post
    include Mongoid::Document

    after_create :notify_subscribers

    private
    def notify_subscribers
        Faye::Client.publish("/posts")
    end
end

アプリ/ビュー/投稿/index.html.erb

<%= subscribe_to(posts_url) do %>
   uhh what do I do here? ajax call to refresh the whole page??
<% end %>

after_create コールバックから直接通知を公開するのは良い考えで、Faye サーバーからメッセージを受け取ったときに「更新」を実装するにはどうすればよいですか? サーバーからデータをリロードするために AJAX 呼び出しを行うだけですか? ゆっくりになりそうです。

さらに、モデルの更新に同様のものを使用したい (ユーザーがコメントを追加した、または作成者がコンテンツを変更したなど) ため、DB を常にスラッシングするのは良い計画ではないようです...

4

1 に答える 1

5

まず第一に、はい、通知を発行することafter_createは問題ありません。メソッドで行うべきことはnotify_subscribers、クライアントで使用する新しい投稿に関するすべての関連情報を公開して、通知を受信したときに別の不要な AJAX 要求を行う必要がないようにすることです。

したがって、たとえば、投稿のtitlecontentが、作成された直後にユーザーが見るのに関連している場合は、次のようにします。

def notify_subscribers
  client = Faye::Client.new('http://localhost:3000/faye')
  client.publish("/posts/new", {
    'title' => self.title,
    'content' => self.content
  })
end

...そして、ビューでは、おそらく jQuery を使用して、サーバーから受信した新しい投稿に関するデータを使用します。ここでは、Rails コードは役に立ちません。たとえば、次のようにします (jQuery を使用していて、ヘッダーに faye.js が含まれていると仮定します):

<script type="text/javascript">
$(function() {
  var client = new Faye.Client('http://localhost:3000/faye');
  client.subscribe("/posts/new", function(data) {
    /* do whatever you need with data */
  });
});
</script>

最後に、転送したい情報が複雑すぎて通知の一部として転送できない場合、またはビューを更新するための既存の AJAX プロセスが既にある場合は、投稿の ID を公開し、subscribeコールバックで jQuery を使用して AJAX 呼び出しをトリガーするだけです。関数。ただし、これは必要な場合にのみお勧めします。

于 2011-08-11T16:09:16.143 に答える