【发布时间】:2016-08-30 04:26:34
【问题描述】:
我有一个变更集,其中一个字段具有唯一约束:
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 是一个结构,而变量 shop 只是来自查询字符串参数的值。
虽然我可以为 Ecto.ConstraintError 创建一个插件,但我觉得这无法提供我需要的详细用户反馈的精细控制。
有什么好的方法可以捕获异常并通知用户商店已经注册?
【问题讨论】:
-
你是如何插入数据库的?您使用的是
Repo.insert!还是Repo.insert?因为根据docs,后者应该返回一个两个元组{:error, changeset},您可以轻松地对其进行模式匹配 -
您确定将
Changeset传递给Repo.insert而不是直接传递结构吗? -
@Dogbert 等人。 . .更新了问题以包含 Repo.insert()。