【问题标题】:Phoenix Presence track users across multiple channelsPhoenix Presence 跨多个渠道跟踪用户
【发布时间】:2018-03-08 21:25:07
【问题描述】:

所以我想使用存在行为来跟踪每个用户的当前房间。问题是如果用户更改其当前房间,我不能/不知道如何更新 room_id。

def join("room:" <> room_id, auth_message, socket) do IO.puts "joining room:" <> room_id if authorized?(room_id, socket) do {:ok, assign(socket, :room_id, room_id)} else {:error, %{reason: "unauthorized"}} end end

当用户加入房间时我传递了 room_id,然后当他在房间之间切换时我做了这个处理程序:

 def handle_in("room:changed", %{"room_id" => room_id, "user_id" => user_id}, socket) do
    IO.puts "user moved to room #{inspect room_id} "
    Presence.track(socket, socket.assigns.user_id, %{room_id: socket.assigns.room_id})
    IO.inspect(Presence.list(socket))
    push socket, "presence_state", Presence.list(socket)
    {:noreply, socket}
  end

问题是,对于他点击的每个房间,列表中都会有一个新条目,所以基本上他同时在所有这些房间中。我想要的是仅在他离开时更新 room_id。

【问题讨论】:

    标签: elixir phoenix-framework phoenix-channels


    【解决方案1】:

    Channel 有一个 terminate/2 回调,您可以使用它来更新状态。

    def terminate(reason, _socket) do
      Logger.debug"> leave #{inspect reason}"
      :ok
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2019-05-03
      相关资源
      最近更新 更多