使用Faye实现Rails的发布/订阅功能

8
在我的Rails应用中,我使用了Faye(Rack适配器)来进行推送通知(例如聊天)。
我想将Faye用于另一个用例(更多的推送通知),但我似乎无法弄清楚如何操作。
在我的应用中,模型可以从后台任务中创建,因此当模型被创建时,我希望刷新我的视图之一(比如说索引操作)。
代码示例:
app/models/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调用来从服务器重新加载数据吗?那似乎会很慢。

进一步说,我想对模型的更新使用类似的东西(例如用户添加了一些评论或作者更改了内容),因此不断地访问数据库似乎不是个好计划...

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 调用。不过我建议只在必要时采用这种方法。


1
你好,我的Faye拒绝从config.ru工作。每次我尝试创建Post对象时,都会出现“RuntimeError:eventmachine未初始化:evma_connect_to_server”的错误。出了什么问题? - prikha
@prikha,你解决了吗?我也遇到了同样的问题。 - Eduardo
@Eduardo 是的!当你开始使用适当的堆栈时,一切都会变得顺畅。Unicorn + Thin。并且使用faye会加载EM。 - prikha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接