8

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

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

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

像这样:

应用程序/模型/post.rb

class Post
    include Mongoid::Document

    after_create :notify_subscribers

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

app/views/posts/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 调用以从服务器重新加载数据?这似乎会很慢。

此外,我想使用类似的东西来更新模型(比如用户添加了一些评论或作者更改了内容),所以一直颠簸数据库似乎不是一个好计划......

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 回答