elixir - elixir phoenix liveview - 通过套接字传递用户 ID
问题描述
在liveview
,我怎样才能将用户数据传递leex
给context
?我有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
. 所以我不知道该怎么做。
解决方案
有很多不同的方法可以做到这一点,但我将描述一个简单的方法。
- 在您“登录”用户的功能中,我假设您有权访问
conn
.user_token
如果您使用 Pow,我还假设您有一个. 如果是这样,请执行以下操作:
conn
|> put_session(:user_token, user_token)
- 现在转到您的
live_helpers.ex
文件(如果没有文件,则创建它)并创建如下函数:
def assign_defaults(session, socket) do
socket =
socket
|> assign_new(:current_user, fn ->
find_current_user(session)
end)
socket
end
- 此外,在 中
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
- 现在在您需要访问 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 的模块并使用此功能。这是一个很小的差异,但它肯定更整洁。
推荐阅读
- python - 有没有办法在不使用 Python 在 Selenium 中打开新浏览器的情况下更改 chrome 设置?
- postgresql - PostgreSql Docker 实例的错误编码
- javascript - Facebook-Share with open graph custom Title, Image, Description not displayed (Magento 2)
- xamarin.forms - 不显示来自 Cosmos db 的项目
- format - 如何将参数格式化为函数
- json - JQ if then 语句作用域
- javascript - 在多次嵌套对象上使用 ES6 .map() 以获取反应组件
- parallel-processing - Playwright 并行执行不适用于 BDD 测试(但它可以在没有 BDD 的情况下工作)
- javascript - 如何从 JavaScript 中之前未选择的数组中随机选择一个元素?
- python-3.x - 将 io.BytesIO 对象放入数据框中