首页 > 解决方案 > elixir phoenix liveview - 通过套接字传递用户 ID

问题描述

liveview,我怎样才能将用户数据传递leexcontext?我有phx.gen.live一个profiles上下文,我想在每次用户创建新配置文件时将 user_id 添加到配置文件中。我将 create_profile 代码更改为:

**profiles.ex (context)**
  def create_profile(attrs \\ %{}, userid) do
    attrs = Map.put(attrs, "user_id", userid)
    %Profile{}
    |> Profile.changeset(attrs)
    |> Repo.insert()
  end

我正在使用pow,所以在正常的凤凰情况下,我会这样做:

user = Pow.Plug.current_user(conn) #<-- this is conn
Profiles.create_profile(profile_params, user.id)

但在liveview,而不是conn,它使用socket. 所以我不知道该怎么做。

标签: elixirphoenix-live-view

解决方案


有很多不同的方法可以做到这一点,但我将描述一个简单的方法。

  1. 在您“登录”用户的功能中,我假设您有权访问conn. user_token如果您使用 Pow,我还假设您有一个. 如果是这样,请执行以下操作:
conn
|> put_session(:user_token, user_token)
  1. 现在转到您的live_helpers.ex文件(如果没有文件,则创建它)并创建如下函数:
  def assign_defaults(session, socket) do
    socket =
      socket
      |> assign_new(:current_user, fn ->
        find_current_user(session)
      end)

    socket
  end
  1. 此外,在 中live_helpers,编写此函数:
  defp find_current_user(session) do
    with user_token when not is_nil(user_token) <- session["user_token"],
         %User{} = user <- Accounts.get_user_by_session_token(user_token),
         do: user
  end
  1. 现在在您需要访问 current_user 的任何 LiveView 模块中,只需将其放入您的mount函数中:
  def mount(_params, session, socket) do
    socket =
      assign_defaults(session, socket)

    {:ok, socket}
  end

然后您将可以访问session.assigns.current_user.

更新:因为我写了我的答案,现在存在一个非常适合这种“默认分配”的新功能:https ://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#on_mount/1

这些天,我将制作一个名为 DefaultAssigns 的模块并使用此功能。这是一个很小的差异,但它肯定更整洁。


推荐阅读