我想使用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语句吗?
答案 0 :(得分:3)
使用function plugs这是一个很好的案例。您可以在示例中看到他们如何将show
操作从多个嵌套案例转换为使用插件。请注意使用halt/1
来阻止请求继续向下游进行。
但是,我发现在注册失败时返回现有用户实例是一个安全问题。如果"字段"最好返回错误。已经被采取了。
这样做,因为"字段"对于用户而言必须是唯一的,您需要创建unique_index
,然后在changeset
中定义unique_constraint
。
现在,在您的create
操作中,如果您尝试插入具有重复"字段"的用户,则changeset
将无效且来自{{1}的阻止将运行。