Rails pub/sub с Фэй

В приложении Rails я использовал Faye (адаптер Rack) для push-уведомлений (для чата).

Я хочу использовать Faye для другого варианта использования (больше push-уведомлений), но я не могу понять это.

В моем приложении модель может быть создана из фонового задания, поэтому я хочу обновить одно из своих представлений (скажем, действие индекса) при создании модели.

Вот так:

приложение/модели/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 для перезагрузки данных с сервера? Кажется, это будет медленно.

Кроме того, я хочу использовать что-то подобное для обновлений модели (скажем, пользователь добавил некоторые комментарии или автор изменил содержимое), поэтому постоянно перебирать БД не кажется хорошим планом...


person Seth Jackson    schedule 11.08.2011    source источник


Ответы (1)


Во-первых, да, публикация уведомления с after_create — это нормально. Что вы должны сделать в своем методе notify_subscribers, так это опубликовать всю соответствующую информацию о новом сообщении, которое вы хотите использовать в клиенте, чтобы вам не приходилось делать еще один ненужный запрос AJAX при получении уведомления. получила.

Так, например, если title и content сообщения важны для просмотра пользователем сразу после его создания, вы должны сделать что-то вроде:

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 для обновления вашего представления, вы можете просто опубликовать идентификатор сообщения и вызвать вызов AJAX с помощью jQuery в subscribe функция обратного вызова. Я бы рекомендовал это только в случае необходимости.

person M. Cypher    schedule 11.08.2011
comment
Как вы это делаете, моя Фэй отказывается работать с config.ru, и я получаю «RuntimeError: eventmachine not initialized: evma_connect_to_server» каждый раз, когда пытаюсь создать объект Post. Что случилось? - person prikha; 11.03.2012
comment
@prikha тебе удалось это решить? У меня такая же проблема. - person Eduardo; 04.05.2012
comment
@Эдуардо Йепп! Все идет, когда вы начинаете использовать правильный стек. Единорог + Тонкий. И с помощью faye загружает EM. - person prikha; 17.05.2012