如何检测当前主题?

How to detect current topic?

我应该在哪里存储主题 ID?

关于socket,我可以用:

def join("topic:" <> topic_id, _params, socket) do
    ...
    socket= assign(socket, :topic_id, topic_id)
    {:ok, socket}
end

那是在套接字范围内,但我的用户可以同时加入多个主题,这意味着每次加入新主题时,上面的代码都会覆盖 topic_id,是这样吗?

如果我想知道 handle_in 中哪个主题 ID 处于活动状态怎么办?

例如:

def handle_in("new_message", params, socket) do

    # what is the active topic id here?

end

我想到了这个:

def handle_in("new_message:" <> topic_id, params, socket) do

    # now, I know that topic_id is the active topic

end

还有其他方法吗?或者这是怎么做的?

join 有一个主题,因此您可以执行额外的验证来检查用户是否可以订阅该主题(检查他们的权限等)

你是对的,订阅主题后,通道在套接字上进行多路复用。

如果您希望传递特定消息的附加信息,参数是放置它们的常见位置:

def handle_in("new_message", %{"topic_id" => topic_id}, socket) do
  ...
end

如果你能解释为什么你需要 topic_id 那么它可以帮助回答你的问题,

用户可以加入多个主题。您可以从 handle_in.

中的 socket 参数访问当前的 topic

所以假设聊天室主题的基础是 "topic",下面是获取主题 ID 的方法:

def handle_in("some_message", _params, socket) do
  "topic:" <> topic_id = socket.topic
  ...
end