2015-10-09 6 views
7

voglio impostare valori di default per un modello a Phoenix quadro, ho provato:quadro phoenix come impostare i valori di default nel modello Ecto

def new(conn, _params) do 

    user = get_session(conn, :user) 
    if is_nil user do 
     user = Repo.get_by(User, name: "guest") 
     conn = put_session(conn, :user, user) 
    end 

    changeset = Module.changeset(%Module{}) 

    changeset 
    |> Ecto.Changeset.put_change(:user, user) 
    |> Ecto.Changeset.put_change(:version, "0.0.0") 
    |> Ecto.Changeset.put_change(:visibility, "public") 

    render(conn, "new.html", user: user, changeset: changeset) 
    end 

Come faccio a impostare valori di default nel modello in modo che appaiano quando new.html è reso?

BTW, ecco la mia funzione di changeset predefinita. Non riuscivo a capire come usarlo? Suppongo di utilizzare un Ecto.changeset.put_change nella pipeline dopo il cast?

def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 

risposta

7

Ci sono diversi modi a seconda della funzione di modifiche

si potrebbe fare (che non hanno fornito qui.):

changeset = Module.changeset(%Module{user: user, version: "0.0.0", visibility: "public"}) 

Un'altra opzione è quella di passare i parametri alla vostra funzione di modifiche:

changeset = Module.changeset(%Module{}, %{user: user, version: "0.0.0", visibility: "public"}) 

Tuttavia è importante notare che la versione con la funzione put_change/3 funziona anche, se si associa il risultato della pipeline:

Cambio:

changeset = Module.changeset(%Module{}) 

changeset 
|> Ecto.Changeset.put_change(:user, user) 
|> Ecto.Changeset.put_change(:version, "0.0.0") 
|> Ecto.Changeset.put_change(:visibility, "public") 

A:

changeset = 
    Module.changeset(%Module{}) 
    |> Ecto.Changeset.put_change(:user, user) 
    |> Ecto.Changeset.put_change(:version, "0.0.0") 
    |> Ecto.Changeset.put_change(:visibility, "public") 

Un'altra opzione è impostare l'impostazione predefinita a livello di database nella migrazione. Se guardate l'opzione :default di Ecto.Migration.add/3 vedrete come farlo.

+0

dolce, grazie! Pensi che sarebbe meglio nella funzione changeset (cioè nel modello invece del controller)? Forse questo sarebbe il modo migliore? –

+0

Dipende dal caso d'uso. Se si desidera impostare i valori predefiniti solo quando si presenta l'utente con il nuovo modulo, sceglierei la prima opzione suggerita. Se stai usando questo in più punti, allora hai una funzione personalizzata di changeset. Se lo si desidera ogni volta che viene creato un nuovo modello di questo tipo, utilizzare il database per i valori predefiniti. – Gazler

+0

fantastico, ho usato i valori di default del database, questo è quello che volevo da sempre, ma non sapevo esistesse :-) –