【问题标题】:Required fields not working phoenix framework必填字段不起作用凤凰框架
【发布时间】:2016-04-24 17:25:18
【问题描述】:

web/models/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

web/controllers/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

web/templates/post/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 %>

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

[birthday_day: "is invalid", birthday_month: "is invalid",
 birthday_year: "is invalid"]

我也应该有以下错误:电子邮件、名字、姓氏、描述、电话......

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

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

    将此添加到您的控制器:

    plug :scrub_params, "post" when action in [:create]
    

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

    birthday_day、birthday_month 和 birthday_year 仍然出现验证错误的原因是空字符串不是有效的整数。

    【讨论】:

    • 哦,是的,没注意那个:)
    猜你喜欢
    • 2016-05-08
    • 2017-01-29
    • 2016-03-20
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多