Javascript ActionCable频道示例1:用户外观。环

Javascript ActionCable频道示例1:用户外观。环,javascript,ruby-on-rails,actioncable,Javascript,Ruby On Rails,Actioncable,我目前正试图完全理解ActionCable。有人能给我解释一下这个示例代码中到底发生了什么吗 我不确定的是,如果current_user.appeen创建了一个循环,因此告诉我该用户是通过从客户端到服务器再返回的ping来登录的?服务器端函数中的“on:”标签的作用是什么? 提前感谢。您是正确的,因为这将是一个来自客户端->服务器->客户端的循环 更详细地说,当连接到频道时,会调用@appeage函数。我们可以在该函数中看到,它使用@perform,调用名为的服务器端函数。不幸的是,在这之后,它

我目前正试图完全理解ActionCable。有人能给我解释一下这个示例代码中到底发生了什么吗

我不确定的是,如果current_user.appeen创建了一个循环,因此告诉我该用户是通过从客户端到服务器再返回的ping来登录的?服务器端函数中的“on:”标签的作用是什么?
提前感谢。

您是正确的,因为这将是一个来自客户端->服务器->客户端的循环

更详细地说,当连接到频道时,会调用
@appeage
函数。我们可以在该函数中看到,它使用
@perform
,调用名为
的服务器端函数。不幸的是,在这之后,它非常模糊,但假设我们想向所有用户广播此人现在在线

可能发生的一个例子是,
用户
模型上的
出现
函数在用户对象上设置一个布尔值,以指示它们处于联机状态,并使用
on
参数,如下所示:

# models/user.rb
def appear(data)
  self.update(online: true, current_room: data['on'])
end
在此之后,我们需要一种方式让其他用户知道此人现在在线。因此,首先我们必须广播这一点,这可能发生在更新之后(有更好的地方可以放它,但为了解释数据流,这就足够了):

现在所有连接到外观频道的用户都将接收数据,因此我们可以将其添加到前端。假设我们只想获取某种包含用户信息的div,如果他们在线,给他们一个class
online
,否则删除该类:

received: (data) ->
  userId = data.user_id
  eventType = data.event
  if eventType == 'appear'
    $('#user_' + userId).addClass 'online'
  else
    $('#user_' + userId).removeClass 'online'
因此,现在它将为所有连接到该频道的用户更新,告诉他们该用户现在在线

请注意,我们没有使用用户当前所在的文件室,但如果需要,我们可以使用
data.room
获取该文件室,并根据需要使用它


希望这有助于澄清问题。

Ty!帮我把事情弄清楚。我误解了subscribed中当前的_user.appease函数。
# 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
received: (data) ->
  userId = data.user_id
  eventType = data.event
  if eventType == 'appear'
    $('#user_' + userId).addClass 'online'
  else
    $('#user_' + userId).removeClass 'online'