故意在凤凰城创建用户

时间:2016-01-10 14:29:46

标签: elixir phoenix-framework

我想使用Phoenix的开箱即用create/2功能将其用于我的用户注册用例。为了实现这一点,我需要有意识地创建一个用户。我无法在Elixir中找到最常用的方法。

例如,这是凤凰城用于创建资源(在本例中为用户)的开箱即用片段:

case Repo.insert(changeset) do
  {:ok, user} ->
    conn
    |> put_status(:created)
    |> put_resp_header("location", user_path(conn, :show, user))
    |> render("show.json", user: user)
  {:error, changeset} ->
    conn
      |> put_status(:unprocessable_entity)
      |> render(BrewswapApi.ChangesetView, "error.json", changeset: changeset)
end

我想做的是首先检查用户是否存在特定字段。如果它存在,则返回带有对象的200,否则运行上面的代码。

我会为此使用嵌套的case语句吗?

1 个答案:

答案 0 :(得分:3)

使用功能插件返回现有用户

使用function plugs这是一个很好的案例。您可以在示例中看到他们如何将show操作从多个嵌套案例转换为使用插件。请注意使用halt/1来阻止请求继续向下游进行。

但是,我发现在注册失败时返回现有用户实例是一个安全问题。如果"字段"最好返回错误。已经被采取了。

使用唯一约束返回错误

这样做,因为"字段"对于用户而言必须是唯一的,您需要创建unique_index,然后在changeset中定义unique_constraint

现在,在您的create操作中,如果您尝试插入具有重复"字段"的用户,则changeset将无效且来自{{1}的阻止将运行。