Elixir 从用户令牌创建关联

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

我有一个用承载令牌进行身份验证的API。我想将令牌解码为
用户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