2016-04-24 15 views
5

web/modelli/post.exI campi obbligatori non funzionante quadro fenice

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/controller/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/nuovo. 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 %> 

Quando presento il modulo con ingressi vuoti per creare un nuovo post, gli errori restituiti sono:

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

avrei dovuto gli errori di: e-mail, nome, cognome, descrizione, telefono è troppo ...

risposta

7

Ecco perché quando si invia un modulo senza riempire un campo, viene inviata una stringa vuota. È necessario utilizzare il plug scrub_params nel controller, che sostituisce i campi vuoti con nils.

aggiungere questo al vostro controller:

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

Questo è ciò che Phoenix genera per impostazione predefinita nel generatore mix phoenix.gen.html. (Beh genera when action in [:create, :update]; si consiglia di passare a che, quando si aggiunge un update azione.)

Il motivo è ancora ottenere errori di convalida per birthday_day, birthday_month, e birthday_year è perché le stringhe vuote non sono numeri interi validi.

+0

Oh sì, non ho prestato attenzione a questo :) –

Problemi correlati