ActionCable永远不会建立与频道

时间:2017-06-17 09:03:26

标签: ruby-on-rails websocket real-time puma actioncable

我正在尝试运行第一个ActionCable示例,但是,我觉得从未建立过从客户端到通道的连接。我几乎跟随edge guides关注此处未提及的其他内容。

# app/channels/notifications_channel.rb
class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    byebug
    stream_from "notifications"
  end

  def unsubscribed
    stop_all_streams
  end

  def receive(data)
    ActionCable.server.broadcast("notifications", data)
  end
end
从来没有被称为byebug。我实际上可以在该文件中添加一堆语法乱码,并且不会在任何地方看到错误。就像永远不会加载文件一样。

这是javascript,我希望看到一个&#34;连接&#34;警告它是否会建立一个从未发生过的连接。文件已加载并正确执行,因为我可以在浏览器控制台中检查App变量,它会显示App.notifications作为有效的Subscription对象(它不会帮助调试很多)虽然大多数属性都是函数)。

// app/assets/javascripts/channels/notifications.js
App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
  connected: function() {
    // Called when the subscription is ready for use on the server
    alert('connected');
  },

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

  received: function(data) {
    alert(data)
    // Called when there's incoming data on the websocket for this channel
    $("#notifications").prepend(data.html);
  }
});

如果它有任何帮助,我的Puma总是以&#34; Single mode&#34;开始,我不确定这可能是问题,也不知道如何修复它。

2 个答案:

答案 0 :(得分:0)

所以这就是原因。我不知怎的只是尝试将所有内容设置为默认值,看看它是否会起作用,而且确实如此。然后,我慢慢添加配置和代码,找出实际上是什么问题,这是-> https://example.com/index.php/product/iphone-7s-white 中的以下行:

config/environments/development.rb

将此设置为config.reload_classes_only_on_change = false 解决了它。

答案 1 :(得分:0)

我遇到了同样的问题,设置config.reload_classes_only_on_change无济于事。

我需要用turbolinks:load包裹频道代码

$(document).on("turbolinks:load", function() {
   // ...
   const channel = consumer.subscriptions.create(
     { channel: channel_name, ...other params },
     connected() {}, 
     disconnected() {}
   )
})