必需的字段不工作凤凰框架

Jer*_*Ges 6 elixir phoenix-framework

网络/模型/ post.ex

defmodule Baby.Post do
  use Baby.Web, :model

  schema "posts" do
    field :cover, :string
    field :email, :string
    field :firstname, :string
    field :lastname, :string
    field :birthday_day, :integer
    field :birthday_month, :integer
    field :birthday_year, :integer
    field :description, :string
    field :phone, :string

    timestamps
  end

  @required_fields ~w(email firstname lastname birthday_day birthday_month birthday_year description phone)
  @optional_fields ~w()

  @doc """
  Creates a changeset based on the `model` and `params`.

  If no params are provided, an invalid changeset is returned
  with no validation performed.
  """
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
Run Code Online (Sandbox Code Playgroud)

网/控制器/ post_controller.ex

defmodule Baby.PostController do

  use Baby.Web, :controller

  alias Baby.Post



  def new(conn, _params) do

    changeset = Post.changeset(%Post{})
    render conn, "new.html", changeset: changeset

  end

  def create(conn, %{"post" => post_params}) do

    changeset = Post.changeset(%Post{}, post_params)

    case Repo.insert(changeset) do 

        {:ok, _post} -> 
          conn
          |> put_flash(:info, "Ton annonce à bien été ajoutée")
          |> redirect(to: "/")

        {:error, changeset} ->
          IO.inspect changeset.valid?
          IO.inspect changeset.errors
          render(conn, "new.html", changeset: changeset)

    end

  end
end
Run Code Online (Sandbox Code Playgroud)

网页/模板/后/ new.html.ex

<%= if @changeset.action do %>
  <div class="alert alert-danger">
    <p>Oops, something went wrong! Please check the errors below.</p>
  </div>
<% end %>

<%= form_for @changeset, post_path(@conn, :create), fn f -> %>

  <label for="email">Email</label><br/>
  <%= text_input f, :email %><br/><br/>

  <label for="email">Prénom</label><br/>
  <%= text_input f, :firstname %><br/><br/>
  <%= error_tag f, :firstname %>

  <label for="email">Nom de famille</label><br/>
  <%= text_input f, :lastname %><br/><br/>

  <label for="email">Date de naissance</label><br/>
  <%= text_input f, :birthday_day, placeholder: "Jour" %>
  <%= text_input f, :birthday_month, placeholder: "Mois" %>
  <%= text_input f, :birthday_year, placeholder: "Année" %>

  <br/><br/>
  <%= error_tag f, :birthday_day %>
  <%= error_tag f, :birthday_month %>
  <%= error_tag f, :birthday_year %>


  <label>Description</label><br/>
  <%= textarea f, :description %><br/><br/>
  <%= error_tag f, :description %>

  <label>Numéro de téléphone</label><br/>
  <%= text_input f, :phone %><br/><br/>
  <%= error_tag f, :phone %>

  <button type="submit">Ajouter mon annonce</button>

<% end %>
Run Code Online (Sandbox Code Playgroud)

当我提交带有空输入的表单来创建新帖子时,返回的错误是:

[birthday_day: "is invalid", birthday_month: "is invalid",
 birthday_year: "is invalid"]
Run Code Online (Sandbox Code Playgroud)

我应该有错误:电子邮件,名字,姓氏,描述,电话......

Dog*_*ert 8

那是因为当您提交表单而不填写字段时,会提交一个空字符串.您需要使用scrub_params控制器中的插件,该插件用nils替换空字段.

将其添加到您的控制器:

plug :scrub_params, "post" when action in [:create]
Run Code Online (Sandbox Code Playgroud)

这是Phoenix在mix phoenix.gen.html生成器中默认生成的内容.(它会生成when action in [:create, :update];您可能希望在添加update操作时切换到该项.)

究其原因,你仍然可以得到验证错误的birthday_day,birthday_month以及birthday_year是因为空字符串不是有效的整数.