Rails паб / саб с Фэй - PullRequest
       32

Rails паб / саб с Фэй

8 голосов
/ 11 августа 2011

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

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

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

Вот так:

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 голосов
/ 11 августа 2011

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

...