ActionCable "subscribed" 方法未被调用
ActionCable "subscribed" method not getting called
我有一个 ActionCable 频道,其 "subscribed" 方法似乎从未被调用过。
在 Rails 日志和 Javascript 控制台中,我可以看到正在建立连接:
I, [2017-07-14T16:02:28.759843 #10658] INFO -- : [ActionCable] Registered connection (Z2lkOi8vd2ViY2FzdC9Vc2VyLzM0NQ)
...
I, [2017-07-14T16:14:18.594274 #12208] INFO -- : [2cdfb51d-e500-49bd-8d7d-c941b8b2bb8a] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
app/assets/javascripts/channel/chats.coffee(下)中的代码似乎被称为:
...
App.global_chat = App.cable.subscriptions.create {
channel: "ChatsChannel"
chat_room_id: $("#chat_room_id").val()
user_agent: navigator.userAgent
},
...
当浏览器控制台显示聊天对象时,它看起来符合预期:
> App.global_chat
< Subscription {consumer: Consumer, identifier: "{"channel":"ChatsChannel","chat_room_id":"32","use… like Gecko) Chrome/58.0.3029.110 Safari/537.36"}", connected: function, disconnected: function, received: function…}
...
但日志显示 ChatsChannel "subscribed" 方法(粘贴在下面)中没有任何内容,并且从未调用 "register_connection" 方法。
# app/channels/chats_channel.rb
class ChatsChannel < ApplicationCable::Channel
def subscribed
logger.add_tags 'ActionCable', "subscribing"
logger.info("subscribing")
stream_from "chat_rooms_#{params['chat_room_id']}_channel"
current_user.register_connection(params[:chat_room_id], params[:user_agent])
end
...
end
有什么想法吗?我对 ActionCable 很陌生。我能找到的所有文档都说 "subscribed" 方法只是在注册连接时自动调用,看起来是这样,所以我不知道这里出了什么问题。
这是 actioncable 5.0.1。
有什么方法可以通过 Javascript 强制执行 ruby "subscribed" 方法吗?
原来问题是我的redis服务器没有在后台运行。 运行 redis-server
在 Rails 应用之外解决了这个问题!
别忘了调整config/cable.yml
到redis:
development:
adapter: redis
并将其添加到您的 Gemfile
:
gem 'redis'
我有一个 ActionCable 频道,其 "subscribed" 方法似乎从未被调用过。
在 Rails 日志和 Javascript 控制台中,我可以看到正在建立连接:
I, [2017-07-14T16:02:28.759843 #10658] INFO -- : [ActionCable] Registered connection (Z2lkOi8vd2ViY2FzdC9Vc2VyLzM0NQ)
...
I, [2017-07-14T16:14:18.594274 #12208] INFO -- : [2cdfb51d-e500-49bd-8d7d-c941b8b2bb8a] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
app/assets/javascripts/channel/chats.coffee(下)中的代码似乎被称为:
...
App.global_chat = App.cable.subscriptions.create {
channel: "ChatsChannel"
chat_room_id: $("#chat_room_id").val()
user_agent: navigator.userAgent
},
...
当浏览器控制台显示聊天对象时,它看起来符合预期:
> App.global_chat
< Subscription {consumer: Consumer, identifier: "{"channel":"ChatsChannel","chat_room_id":"32","use… like Gecko) Chrome/58.0.3029.110 Safari/537.36"}", connected: function, disconnected: function, received: function…}
...
但日志显示 ChatsChannel "subscribed" 方法(粘贴在下面)中没有任何内容,并且从未调用 "register_connection" 方法。
# app/channels/chats_channel.rb
class ChatsChannel < ApplicationCable::Channel
def subscribed
logger.add_tags 'ActionCable', "subscribing"
logger.info("subscribing")
stream_from "chat_rooms_#{params['chat_room_id']}_channel"
current_user.register_connection(params[:chat_room_id], params[:user_agent])
end
...
end
有什么想法吗?我对 ActionCable 很陌生。我能找到的所有文档都说 "subscribed" 方法只是在注册连接时自动调用,看起来是这样,所以我不知道这里出了什么问题。
这是 actioncable 5.0.1。
有什么方法可以通过 Javascript 强制执行 ruby "subscribed" 方法吗?
原来问题是我的redis服务器没有在后台运行。 运行 redis-server
在 Rails 应用之外解决了这个问题!
别忘了调整config/cable.yml
到redis:
development:
adapter: redis
并将其添加到您的 Gemfile
:
gem 'redis'