Copy & Paste Engineer

【Elixir】Ectoで個別にエラーを追加する方法

【Elixir】Ectoで個別にエラーを追加する方法

ElixirのEctoで個別にエラーを追加する方法。 ちょっと面倒な時にやる僕が個人的にやっている方法。

確認環境

Ectoスキーマの準備

まず、Ectoスキーマを定義します。この例では具体的なフィールドは定義しませんが、必要に応じて追加してください。

defmodule Demo.Param do
  use Ecto.Schema
  import Ecto.Changeset

  embedded_schema do
    # 実際のフィールド定義をここに記述
  end
end

エラーメッセージの追加

次に、特定の条件が満たされたときにエラーメッセージを追加します。これは、Ecto.Changeset.add_error/3関数を使用して行われます。

defmodule DemoWeb.Demo.Index do
  use DemoWeb, :live_view

  @impl true
  def mount(params, session, socket) do
    {
      :ok,
      socket
      |> assign(
        :changeset,
        Demo.Param.changeset(%Demo.Param{}, %{})
      )
    }
  end

  # バリデーション
  @impl true
  def handle_event("bulk-send", %{"param" => %{"test" => test}}, socket) do
    changeset = Demo.Schema.changeset(%Demo.Schema{}, %{})

    # エラー条件
    changeset =
      if length(bulk_plans) > 0 do
        Ecto.Changeset.add_error(changeset, :message, "エラー")
      else
        changeset
      end
    # Actionの変更
    changeset = %{changeset | action: :validate}

    {:noreply,
     socket |> assign(:send_changeset, changeset)}
  end
end

参考