从用户令牌创建关联

时间:2018-01-24 02:49:27

标签: elixir phoenix-framework

我有一个使用不记名令牌进行身份验证的API。我想将令牌解码为user_id,查找用户,并将该用户添加到他们在帖子请求中创建的项目中。

我使用像这样的硬编码用户在项目上下文中正常工作:

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

我还可以解码控制器中的令牌以获得user_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

并且,create_project函数如下所示:

def create_project(attrs \\ %{}) do
    %Project{}
    |> Project.changeset(attrs)
    |> Repo.insert()
  end

但是,将user_id从控制器传递到上下文的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

将参数添加到上下文函数

Projects.create_project(user_id, project_params)

虽然可以说user_id应该合并到project_params我觉得应该得到自己的参数。

其他上下文功能很可能也需要当前用户。想想Project.list_projects(user_id)只返回允许用户看到的项目,或Project.destroy_project(user_id, project_id)将检查是否允许用户销毁该项目。

user_id分配给您的conn

如果user_id是大多数请求的一部分,您可以使用Plug.Conn#assign/3将其分配给路由器中的conn。然后,在您的控制器中,您可以使用conn.assigns.user_id