网络/模型/ 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
网络/控制器/ 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
网络/模板/后/ 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"]
我应该有以下错误:电子邮件,名字,姓氏,说明,电话......
答案 0 :(得分:8)
那是因为当您提交表单而没有填写字段时,会提交一个空字符串。您需要使用控制器中的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
验证错误的原因是因为空字符串不是有效整数。