특히 제약 조건 오류를 처리 내가 필드 중 하나에 고유 제한 조건이있는 변경 집합이 다음 컨트롤러 중 하나에서피닉스
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
을, 나는 새로운 가게를 삽입합니다. 중복 상점이 만들어지는 경우, 예외가 발생합니다 : 변수하면서, % 숍이 구조체는 것을
가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
참고 : 여기에
** (exit) an exception was raised:
** (Ecto.ConstraintError) constraint error when attempting to insert model:
* unique: shops_shop_index
내가 레코드를 저장하는 코드입니다 shop은 쿼리 문자열 매개 변수의 값입니다.
Ecto.ConstraintError에 대한 플러그를 만들 수는 있지만 자세한 사용자 피드백에 필요한 세분화 된 컨트롤이 제공되지 않는다고 생각합니다.
예외를 포착하고 상점이 이미 등록되었다는 것을 사용자에게 알리는 좋은 방법은 무엇입니까?
어떻게 데이터베이스에 삽입하나요? 'Repo.insert!'또는'Repo.insert'를 사용하고 있습니까? [docs] (https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3)에 따르면 후자는 쉽게 패턴 매치가 가능한 두 개의 튜플'{: error, changeset}'을 반환해야하기 때문에 on –
구조체가 아닌'Repo.insert'에'Changeset'을 전달하고 있습니까? – Dogbert
@Dogbert 외. . . Repo.insert()를 포함하도록 질문이 업데이트되었습니다. – sheldonkreger