如何检测当前主题?

时间:2016-05-19 14:17:08

标签: phoenix-framework phoenix-channels

我将在哪里存储主题ID?

至于socket,我可以使用:

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

那是在socket范围内,但是我的用户可以同时加入多个主题,这意味着每次加入新主题时上面的代码都会覆盖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

还有其他办法吗?或者这就是它的完成方式?

2 个答案:

答案 0 :(得分:3)

用户可以加入多个主题。您可以通过topic中的socket参数访问当前handle_in

因此,假设房间主题的基础为"topic",以下是您获取主题ID的方法:

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

答案 1 :(得分:0)

join有一个主题,以便您可以执行其他验证以检查用户是否可以订阅该主题(检查其权限等)

您是正确的,在订阅主题后,通道将通过套接字进行多路复用。

如果您希望传递特定邮件的其他信息,则可以使用params:

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

如果您能解释为什么需要topic_id,那么它可以帮助您解决问题,