2011-08-11 32 views
8

Trong ứng dụng Rails, tôi đã sử dụng Faye (Bộ điều hợp giá) cho thông báo đẩy (để trò chuyện).Rails pub/sub with faye

Tôi muốn sử dụng Faye cho một trường hợp sử dụng khác (nhiều thông báo đẩy hơn) nhưng tôi dường như không thể hiểu được.

Trong ứng dụng của tôi, một mô hình có thể được tạo từ một công việc nền vì vậy tôi muốn làm mới một trong các chế độ xem của tôi (nói hành động chỉ mục) khi mô hình được tạo.

Giống như vậy:

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 %> 

Vì vậy, được xuất bản thông báo trực tiếp từ một cuộc gọi lại sau một ý tưởng hay và khi tôi nhận được một tin nhắn từ máy chủ Faye làm thế nào để tôi thực hiện "cập nhật"? Tôi có thực hiện cuộc gọi AJAX để tải lại dữ liệu từ máy chủ không? Điều đó có vẻ như nó sẽ chậm.

Hơn nữa, tôi muốn sử dụng một cái gì đó tương tự để cập nhật mô hình (giả sử người dùng thêm một số nhận xét hoặc tác giả thay đổi nội dung) để đập DB tất cả thời gian dường như không phải là một kế hoạch tốt ...

Trả lời

5

Trước hết, có, xuất bản thông báo với after_create là tốt. Những gì bạn nên làm trong phương pháp notify_subscribers của bạn là xuất bản tất cả thông tin có liên quan về bài đăng mới mà bạn muốn sử dụng trong ứng dụng khách để không phải phải thực hiện một yêu cầu AJAX không cần thiết khác khi nhận được thông báo.

Vì vậy, ví dụ, nếu titlecontent của bài có liên quan cho người sử dụng để xem ngay sau khi nó được tạo ra, bạn sẽ làm điều gì đó như:

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

... và sau đó, trong xem, có thể bạn sẽ sử dụng jQuery để sử dụng dữ liệu về bài đăng mới mà bạn nhận được từ máy chủ. Mã Rails sẽ không giúp bạn ở đây. Ví dụ. bạn sẽ làm điều này (giả sử bạn đang sử dụng jQuery và đã bao gồm faye.js trong phần đầu của bạn):

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

Cuối cùng, nếu bằng cách nào đó thông tin mà bạn muốn chuyển là quá phức tạp để chuyển như một phần của thông báo, hoặc bạn đã có các quy trình AJAX hiện có để cập nhật chế độ xem của mình, bạn chỉ có thể xuất bản ID của bài đăng và kích hoạt cuộc gọi AJAX với jQuery trong hàm gọi lại subscribe. Tôi muốn đề nghị này chỉ khi cần thiết mặc dù.

+1

Làm thế nào để bạn làm điều đó Faye của tôi từ chối làm việc mẫu config.ru Và tôi nhận được 'RuntimeError: eventmachine không được khởi tạo: evma_connect_to_server' mỗi khi tôi cố gắng tạo đối tượng Post. Chuyện gì vậy? – prikha

+0

@prikha bạn đã giải quyết được điều đó chưa? Tôi có cùng một vấn đề. – Eduardo

+0

@Eduardo Yepp! Mọi thứ diễn ra khi bạn bắt đầu sử dụng ngăn xếp phù hợp. Unicorn + Mỏng. Và sử dụng tải faye EM. – prikha