ActionCable не обновляет страницу

Я создаю рубиновое приложение и пытаюсь реализовать кабель действия, когда пользователь делает сообщение, я хочу, чтобы индекс сообщения обновлялся для всех пользователей. В моих каналах/posts.js у меня есть:

App.posts = App.cable.subscriptions.create("PostsChannel", {
  connected: function() {
    // Called when the subscription is ready for use on the server
  },

  disconnected: function() {
    // Called when the subscription has been terminated by the server
  },

  received: function(data) {
    // Called when there's incoming data on the websocket for this channel
    console.log(data)
    $('#list').html("<%= escape_javascript render('list') %>")
  }
});

в PostRelayJob.rb у меня есть:

class PostRelayJob < ApplicationJob
  queue_as :default

  def perform(post)
    ActionCable.server.broadcast "posts",
    post: PostsController.render(list)
    # Do something later
  end
end

и в моделях/post.rb:

after_commit { PostRelayJob.perform_later(self) }

Когда я добавляю сообщение в консоль сервера, я получаю:

[ActiveJob] [PostRelayJob] [57126ec7-b091-48fc-91aa-2f940caa9421] Performing PostRelayJob from Async(default) with arguments: #<GlobalID:0x00000003aa10d8 @uri=#<URI::GID gid://today-i-have2/Post/15>>
[ActiveJob] Enqueued PostRelayJob (Job ID: 57126ec7-b091-48fc-91aa-2f940caa9421) to Async(default) with arguments: #<GlobalID:0x000000037af000 @uri=#<URI::GID gid://today-i-have2/Post/15>>
[ActiveJob] [PostRelayJob] [57126ec7-b091-48fc-91aa-2f940caa9421] Performed PostRelayJob from Async(default) in 3.66ms

Rendering posts/create.js.erb
Rendered posts/_list.html.erb (7.5ms)
Rendered posts/create.js.erb (9.0ms)

Однако сообщение в другом браузере не обновляется, я новичок в рельсах, поэтому любая помощь будет очень признательна.


person user2320239    schedule 16.09.2016    source источник


Ответы (2)


Я думаю, что такое поведение возникает при том обстоятельстве, что вы создаете свой объект Post в консоли Rails. Это сильно зависит от вашей конфигурации ActionCable, но я думаю, что вы не используете Redis в своей среде разработки.

В конфигурации по умолчанию для сред разработки используется адаптер async. Этот адаптер работает только в рамках одного и того же процесса. Чтобы включить межпроцессное взаимодействие, вам понадобится альтернативный адаптер.

Я бы предложил установить Redis (например, через brew redis), запустить его с redis-server и обновить ваш config/cable.yml с помощью:

development:
  adapter: redis
  url: redis://localhost:6379
person anka    schedule 19.08.2017

Во-первых, кажется, что вы передаете весь список, а не просто добавляете каждый новый элемент. Если вы хотите сделать это так, как вы это делаете, я считаю, что ваша проблема в вашем JS. Вам нужно jQuery удалить свой старый список, а jQuery добавить новый список. Вы можете сделать это, создав контейнер для своего списка следующим образом:

<div id="list-container">
  Whatever HTML has the id "list" here
</div>

Затем, когда вы получаете данные:

received: function(data) {
// Called when there's incoming data on the websocket for this channel
console.log(data)
$('#list').remove
$('#list-container').append(data)
}
person Jeremy    schedule 08.12.2016