ActionCable Channel 示例 1:用户外观。环形?
ActionCable Channel example 1: User appearances. Loop?
我目前正在尝试最全面地了解 ActionCable。有人能解释一下官方 doc:
的这个示例代码到底发生了什么吗
# app/channels/appearance_channel.rb
class AppearanceChannel < ApplicationCable::Channel
def subscribed
current_user.appear
end
def unsubscribed
current_user.disappear
end
def appear(data)
current_user.appear on: data['appearing_on']
end
def away
current_user.away
end
end
连同:
# app/assets/javascripts/cable/subscriptions/appearance.coffee
App.cable.subscriptions.create "AppearanceChannel",
# Called when the subscription is ready for use on the server
connected: ->
@install()
@appear()
# Called when the WebSocket connection is closed
disconnected: ->
@uninstall()
# Called when the subscription is rejected by the server
rejected: ->
@uninstall()
appear: ->
# Calls `AppearanceChannel#appear(data)` on the server
@perform("appear", appearing_on: $("main").data("appearing-on"))
away: ->
# Calls `AppearanceChannel#away` on the server
@perform("away")
buttonSelector = "[data-behavior~=appear_away]"
install: ->
$(document).on "turbolinks:load.appearance", =>
@appear()
$(document).on "click.appearance", buttonSelector, =>
@away()
false
$(buttonSelector).show()
uninstall: ->
$(document).off(".appearance")
$(buttonSelector).hide()
我不确定的是,如果 current_user.appear 创建一个循环并因此告诉我用户已通过从客户端到服务器并返回的 ping 命令登录?服务器端显示功能中的 'on:' 主题标签有什么作用?
提前致谢。
从客户端-> 服务器-> 客户端的循环来看,您是正确的。
更详细地说,当连接到频道时,@appear
函数被调用。我们可以在该函数中看到,它使用 @perform
调用名为 appear
的服务器端函数。不幸的是,在此之后它很模糊,但假设我们想向所有用户广播回这个人现在在线。
可能发生的情况的一个例子是 User
模型上的 appear
函数在用户对象上设置一个布尔值以指示他们在线,并使用 on
参数如下:
# models/user.rb
def appear(data)
self.update(online: true, current_room: data['on'])
end
在此之后,我们需要一种方法让其他用户知道此人现在在线。所以首先我们必须广播这个,这可能会在更新后发生(有更好的地方可以放置它,但为了解释数据流,这就足够了):
# models/user.rb
def appear(data)
self.update(online: true, current_room: data['on'])
ActionCable.server.broadcast "AppearanceChannel", {event: 'appear', user_id: self.id, room: self.current_room}
end
所以现在所有连接到外观频道的用户都会收到数据,所以我们可以在前端添加这个。假设我们只想获取某种具有用户信息的 div,如果他们在线,则给他们一个 class online
,否则删除 class:
received: (data) ->
userId = data.user_id
eventType = data.event
if eventType == 'appear'
$('#user_' + userId).addClass 'online'
else
$('#user_' + userId).removeClass 'online'
所以现在它会更新所有连接到频道的用户,告诉他们这个用户现在在线。
请注意,我们没有使用用户当前所在的房间,但如果需要,我们可以使用 data.room
获取它,然后根据需要使用它。
希望这有助于澄清事情。
我目前正在尝试最全面地了解 ActionCable。有人能解释一下官方 doc:
的这个示例代码到底发生了什么吗# app/channels/appearance_channel.rb
class AppearanceChannel < ApplicationCable::Channel
def subscribed
current_user.appear
end
def unsubscribed
current_user.disappear
end
def appear(data)
current_user.appear on: data['appearing_on']
end
def away
current_user.away
end
end
连同:
# app/assets/javascripts/cable/subscriptions/appearance.coffee
App.cable.subscriptions.create "AppearanceChannel",
# Called when the subscription is ready for use on the server
connected: ->
@install()
@appear()
# Called when the WebSocket connection is closed
disconnected: ->
@uninstall()
# Called when the subscription is rejected by the server
rejected: ->
@uninstall()
appear: ->
# Calls `AppearanceChannel#appear(data)` on the server
@perform("appear", appearing_on: $("main").data("appearing-on"))
away: ->
# Calls `AppearanceChannel#away` on the server
@perform("away")
buttonSelector = "[data-behavior~=appear_away]"
install: ->
$(document).on "turbolinks:load.appearance", =>
@appear()
$(document).on "click.appearance", buttonSelector, =>
@away()
false
$(buttonSelector).show()
uninstall: ->
$(document).off(".appearance")
$(buttonSelector).hide()
我不确定的是,如果 current_user.appear 创建一个循环并因此告诉我用户已通过从客户端到服务器并返回的 ping 命令登录?服务器端显示功能中的 'on:' 主题标签有什么作用? 提前致谢。
从客户端-> 服务器-> 客户端的循环来看,您是正确的。
更详细地说,当连接到频道时,@appear
函数被调用。我们可以在该函数中看到,它使用 @perform
调用名为 appear
的服务器端函数。不幸的是,在此之后它很模糊,但假设我们想向所有用户广播回这个人现在在线。
可能发生的情况的一个例子是 User
模型上的 appear
函数在用户对象上设置一个布尔值以指示他们在线,并使用 on
参数如下:
# models/user.rb
def appear(data)
self.update(online: true, current_room: data['on'])
end
在此之后,我们需要一种方法让其他用户知道此人现在在线。所以首先我们必须广播这个,这可能会在更新后发生(有更好的地方可以放置它,但为了解释数据流,这就足够了):
# models/user.rb
def appear(data)
self.update(online: true, current_room: data['on'])
ActionCable.server.broadcast "AppearanceChannel", {event: 'appear', user_id: self.id, room: self.current_room}
end
所以现在所有连接到外观频道的用户都会收到数据,所以我们可以在前端添加这个。假设我们只想获取某种具有用户信息的 div,如果他们在线,则给他们一个 class online
,否则删除 class:
received: (data) ->
userId = data.user_id
eventType = data.event
if eventType == 'appear'
$('#user_' + userId).addClass 'online'
else
$('#user_' + userId).removeClass 'online'
所以现在它会更新所有连接到频道的用户,告诉他们这个用户现在在线。
请注意,我们没有使用用户当前所在的房间,但如果需要,我们可以使用 data.room
获取它,然后根据需要使用它。
希望这有助于澄清事情。