Rails pub / sub with faye

时间:2011-08-11 15:55:15

标签: ruby-on-rails publish-subscribe faye

在Rails应用程序中,我使用Faye(机架适配器)进行推送通知(用于聊天)。

我想将Faye用于另一个用例(更多推送通知),但我似乎无法弄明白。

在我的应用程序中,可以从后台作业创建模型,因此我想在创建模型时刷新我的一个视图(比如索引操作)。

像这样:

应用程序/模型/ 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并不是一个好的计划......

1 个答案:

答案 0 :(得分: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并使用jQuery触发AJAX调用在subscribe回调函数中。我只会在必要时推荐这个。