2011-08-11 19 views
8

En una aplicación de Rails he usado Faye (adaptador de bastidor) para notificaciones push (para chat).Rails pub/sub con faye

Quiero usar Faye para otro caso de uso (más notificaciones push) pero parece que no puedo resolverlo.

En mi aplicación, se puede crear un modelo a partir de un trabajo en segundo plano, así que quiero actualizar una de mis vistas (digamos la acción de índice) cuando se crea el modelo.

así:

app/modelos/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 %> 

Así es la publicación de la notificación directamente desde una devolución de llamada after_create es una buena idea y cuando recibo un mensaje del servidor de Faye, ¿cómo hago para implementar la "actualización"? ¿Acabo de hacer una llamada AJAX para volver a cargar los datos del servidor? Parece que sería lento.

Además quiero usar algo similar para las actualizaciones del modelo (por ejemplo un usuario agrega algunos comentarios o el autor ha cambiado el contenido) para golear el PP todo el tiempo no parece ser un buen plan ...

Respuesta

5

En primer lugar, sí, publicar la notificación con after_create está bien. Lo que debe hacer en su método notify_subscribers es publicar toda la información relevante sobre la nueva publicación que desea utilizar en el cliente para que no tenga que hacer otra solicitud AJAX innecesaria cuando se reciba la notificación.

Así, por ejemplo, si el title y content del puesto son relevantes para el usuario ver inmediatamente después de que se crea, que haría algo como:

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

... y luego, en la vista, es probable que use jQuery para usar los datos sobre la nueva publicación que recibe del servidor. El código de Rails no te ayudará aquí. P.ej. podría hacer esto (suponiendo que está utilizando jQuery y ha incluido faye.js en su cabecera):

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

Por último, si de alguna manera la información que desea transferir es demasiado complejo para transferir la mayor parte de la notificación, o ya tiene procesos AJAX existentes para actualizar su vista, puede publicar la ID de la publicación y activar una llamada AJAX con jQuery en la función de devolución de llamada subscribe. Sin embargo, lo recomendaría solo si es necesario.

+1

Cómo lo hace mi Faye se niega a trabajar en el formulario config.ru Y obtengo 'RuntimeError: eventmachine no inicializado: evma_connect_to_server' cada vez que intento crear el objeto Post. ¿Qué pasa? – prikha

+0

@prikha has logrado resolver eso? Estoy teniendo el mismo problema. – Eduardo

+0

@Eduardo Yepp! Todo funciona cuando comienzas a usar la pila adecuada. Unicornio + Delgado Y usando faye carga EM. – prikha