2016-04-24 28 views
5

網/模型/ 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 

網頁/模板/後/新。 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"] 

我應該有錯誤爲:電子郵件,名字,姓氏,說明,電話太...

回答

7

這是因爲當您提交表單而未填充字段時,會提交空字符串。您需要使用控制器中的scrub_params插件,該插件使用nils替換空字段。

添加到您的控制器:

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

這就是鳳凰默認生成的mix phoenix.gen.html發電機。 (那麼它產生when action in [:create, :update],你可能想切換到,當你添加一個update動作。)

的原因,你仍然可以得到驗證錯誤爲birthday_daybirthday_month,並birthday_year是因爲空字符串不是有效的整數。

+0

噢,沒有注意到那:) –