Экто-проверка и запрос не выполняются без ошибок - PullRequest
0 голосов
/ 27 апреля 2018

Привет :) У меня небольшая проблема при попытке вставить данные с помощью формы.

Когда я вставляю, перенаправление работает, но появляется любое сообщение об ошибке.

Мой контроллер выглядит так:

defmodule HexProjectWeb.UserController do
  use HexProjectWeb, :controller

  import Ecto.Query

  alias HexProject.Accounts
  alias HexProject.Accounts.User
  alias HexProject.Gender

  def new(conn, _params) do
    genders = HexProject.Repo.all(
      from g in Gender,
      select: %{name: g.name, id: g.id}
    )

    changeset = Accounts.change_user(%User{})

    conn
    |> assign(:changeset, changeset)
    |> assign(:genders, genders)
    |> render("new.html")

    ##render(conn, "new.html", changeset: changeset)
  end

  def create(conn, %{"user" => user_params}) do
    case Accounts.create_user(user_params) do
      {:ok, user} ->
        conn
        |> put_flash(:info, "User created successfully.")
        |> redirect(to: user_path(conn, :show, user))
      {:error, %Ecto.Changeset{} = changeset} ->
        genders = HexProject.Repo.all(
          from g in Gender,
          select: %{name: g.name, id: g.id}
        )
        render(conn, "new.html", changeset: changeset, genders: genders)
    end
  end

  def show(conn, %{"id" => id}) do
    user = Accounts.get_user!(id)
    render(conn, "show.html", user: user)
  end
end

Моя схема выглядит так:

defmodule HexProject.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset
  alias HexProject.Accounts.User

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  schema "users" do
    field :avatar, :string
    field :birth_date, :date
    field :email, :string, size: 100
    field :firstname, :string, size: 30
    belongs_to :gender, HexProject.Gender
    field :lastname, :string, size: 30
    field :login, :string, size: 30
    field :newsletter, :boolean, default: false
    field :password, :string, size: 32
    field :pseudo, :string, size: 20
    field :token, :string, size: 32
    field :token_verif, :boolean, default: false

    timestamps(type: :utc_datetime)
  end

  @doc false
  def changeset(%User{} = user, attrs) do
    user
    |> cast(attrs, [:gender_id, :firstname, :lastname, :login, :password, :pseudo, :email, :birth_date, :token, :token_verif, :avatar, :newsletter])
    |> validate_required([:gender_id, :firstname, :lastname, :email])
    |> validate_length(:firstname, min: 2)
    |> validate_length(:lastname, min: 2)
    |> validate_length(:password, is: 32)
    |> validate_format(:email, ~r/.+@.+\..+/, [message: "Entrer un email valide avec @ et ."])
    |> unique_constraint(:email)
  end
end

Все мои запросы находятся в моих учетных записях.ex (я показываю вам только запрос на вставку, потому что это имеет значение здесь)

defmodule HexProject.Accounts do
  @moduledoc """
  The Accounts context.
  """

  import Ecto.Query, warn: false
  alias HexProject.Repo

  alias HexProject.Accounts.User

  @doc """
  Creates a user.

  ## Examples

      iex> create_user(%{field: value})
      {:ok, %User{}}

      iex> create_user(%{field: bad_value})
      {:error, %Ecto.Changeset{}}

  """
  def create_user(attrs \\ %{}) do
    %User{}
    |> User.changeset(attrs)
    |> Repo.insert()
  end

  @doc """
  Returns an `%Ecto.Changeset{}` for tracking user changes.

  ## Examples

      iex> change_user(user)
      %Ecto.Changeset{source: %User{}}

  """
  def change_user(%User{} = user) do
    User.changeset(user, %{})
  end
end

и моя форма:

<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
    <%= select f, :genders, Enum.map(@genders, &{&1.name, &1.id}), prompt: "Sexe" %>
        <label>
            Email: <%= text_input f, :mail %>
        </label>

        <label>
            Lastname: <%= text_input f, :lastname %>
        </label>

        <label>
            Firstname: <%= text_input f, :firstname %>
        </label>

        <label>
            Newsletter: <%= checkbox f, :newsletter %>
        </label>

        <%= submit "Submit" %>
    <% end %>

Даже если я предоставлю неправильные значения, форма отправляется, и ошибки не появляются. Я заметил, что это не удалось, потому что он представил форму со всеми значениями после отправки (и, конечно, данные не были вставлены).

Спасибо за поддержку.

1 Ответ

0 голосов
/ 27 апреля 2018

Когда не удалось вставить запись, он выполняет следующий код:

 {:error, %Ecto.Changeset{} = changeset} ->
    genders = HexProject.Repo.all(
      from g in Gender,
      select: %{name: g.name, id: g.id}
    )
    render(conn, "new.html", changeset: changeset, genders: genders)

так что да, он просто отображает страницу new.html со всеми значениями, взятыми из отправленного changeset. Если вы хотите отобразить сообщение об ошибке, вы действительно должны дать команду Phoenix сделать это , никакой магии нет:

 {:error, %Ecto.Changeset{} = changeset} ->
    genders = HexProject.Repo.all(
      from g in Gender,
      select: %{name: g.name, id: g.id}
    )
    conn
    |> put_flash(:error, "User was not created.")
    |> render("new.html", changeset: changeset, genders: genders)
...