Elixir 从用户令牌创建关联
我有一个用承载令牌进行身份验证的API。我想将令牌解码为Elixir 从用户令牌创建关联,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个用承载令牌进行身份验证的API。我想将令牌解码为用户id,查找一个用户,并将该用户添加到他们在post请求中创建的项目中 我使用如下硬编码用户使项目环境中的一切正常工作: def changeset(%Project{} = project, attrs) do project |> cast(attrs, [:name, :url]) |> validate_required([:name, :url]) |> put_assoc(:u
用户id
,查找一个用户,并将该用户添加到他们在post请求中创建的项目中
我使用如下硬编码用户使项目环境中的一切正常工作:
def changeset(%Project{} = project, attrs) do
project
|> cast(attrs, [:name, :url])
|> validate_required([:name, :url])
|> put_assoc(:users, [get_user])
end
defp get_user do
Repo.one(from x in User, order_by: [desc: x.id], limit: 1)
end
我还可以解码控制器中的令牌以获得用户id
:
def create(conn, %{"project" => project_params}) do
user_id = SomeFunction.gives.me.an.id
with {:ok, %Project{} = project} <- Projects.create_project(project_params) do
conn
|> put_status(:created)
|> put_resp_header("location", project_path(conn, :show, project))
|> render("show.json", project: project)
end
end
但是,将用户id从控制器传递到上下文的最佳方法是什么?向上下文函数添加参数
项目。创建项目(用户id、项目参数)
虽然有人可能会说,user\u id
应该合并到project\u params
中,但我认为它应该有自己的参数
其他上下文函数也可能需要当前用户。想想Project。列出只返回用户允许查看的项目的项目(user\u id)
,或Project。销毁项目(user\u id,Project\u id)
,检查用户是否允许销毁该项目
将用户id
分配给您的连接
当
用户id
是大多数请求的一部分时,您可以使用将其分配给路由器中的连接。在控制器中,您可以使用conn.assigns.user\u id
谢谢您的回复!如果将其作为参数添加到上下文函数中,那么如何创建关联?我无法轻松调用put\u assoc(:users,[user])
,因为架构不在上下文中。而且,我尝试了Map.put
将其添加到发送到变更集的attrs
,但它似乎没有将其作为参数添加。你对这一部分有什么见解吗?我在创建上下文
函数中添加了|>exto.Changeset.put\u assoc(:users,user)
,效果很好。我想这是最好的办法。谢谢你的帮助!我很高兴你解决了这个问题。您还可以将该行移动到模型中的新函数,并从上下文调用它,如|>Project.set_users([user_id])
def create_project(attrs \\ %{}) do
%Project{}
|> Project.changeset(attrs)
|> Repo.insert()
end