特定约束错误,我有对中的一个字段唯一约束的变更:处理在凤凰
defmodule Oauth.Shop do
use Ecto.Model
import Ecto.Changeset
alias Ecto.Changeset
schema "shops" do
field :shop, :string
field :access_token, :string
field :scope, :string
field :active, :boolean
timestamps
end
def changeset(shop, params \\ %{}) do
shop
|> cast(params, [:shop, :access_token, :scope, :active])
|> Changeset.validate_required([:shop, :access_token, :scope, :active])
|> unique_constraint(:shop)
end
end
在控制器中的一个,我插入一个新的店。但是,如果正在创建重复的店铺,将引发一个异常:
** (exit) an exception was raised:
** (Ecto.ConstraintError) constraint error when attempting to insert model:
* unique: shops_shop_index
这里就是我保存记录代码:
def save_shop({:ok, access_params}, shop) do
Repo.insert(%Shop{shop: shop, access_token: access_params.access_token, scope: access_params.scope})
hook_uninstall(shop, access_params.access_token)
{:ok}
end
注意,折商店是一个结构,而可变shop只是查询字符串参数中的一个值。
尽管我可以为Ecto.ConstraintError创建一个插件,但我觉得这不会给我详细的用户反馈所需的精细控制。
什么是捕捉异常并通知用户该商店已被注册的好方法?
你是如何插入数据库的?你在使用'Repo.insert!'还是'Repo.insert'?因为根据[docs](https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3),后者应该返回一个两个元组'':error,changeset}',您可以轻松地匹配模式匹配在 –
你确定你传递'Changeset'到'Repo.insert'而不是直接结构? – Dogbert
@Dogbert et al。 。 。更新了问题以包含Repo.insert()。 – sheldonkreger