2015-10-09 19 views
7

Chcę ustawić wartości domyślne dla modelu w Phoenix Framework próbowałem:feniks ramy jak ustawić wartości domyślne w modelu ekto

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 

Jak ustawić wartości domyślne w modelu tak, że pojawia się, gdy new.html jest renderowany?

BTW, oto moja domyślna funkcja zestawu zmian. Nie mogłem wymyślić, jak z niego korzystać? Zakładam użycie Ecto.changeset.put_change w potoku po obsadzie?

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

Odpowiedz

7

Istnieje kilka sposobów, w zależności od swojej funkcji changeset

Można zrobić (które nie zostały przewidziane tutaj.):

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

Innym rozwiązaniem jest przekazanie parametrów do listy changeset funkcja:

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

jednak ważne jest, aby pamiętać, że wersja z funkcją put_change/3 będzie również działać, jeśli wiążą wynik swojej rurociągu:

Zmiana:

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") 

Do:

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

Inną opcją jest ustawienie wartości domyślnej na poziomie bazy danych podczas migracji. Jeśli spojrzysz na opcję :default z Ecto.Migration.add/3, zobaczysz, jak to zrobić.

+0

słodki, dzięki! Czy uważasz, że byłoby lepiej w funkcji zestawu zmian (tj. W modelu zamiast kontrolera)? Może to byłby lepszy sposób? –

+0

To zależy od przypadku użycia. Jeśli chcesz ustawić wartości domyślne podczas prezentacji użytkownika w nowym formularzu, skorzystam z pierwszej opcji, którą zasugerowałem. Jeśli używasz tego w kilku miejscach, masz niestandardową funkcję zmiany. Jeśli chcesz go za każdym razem, gdy tworzony jest nowy model tego typu, użyj bazy danych dla wartości domyślnych. – Gazler

+0

niesamowite, użyłem domyślnych wartości bazy danych, tego chciałem cały czas, ale nie wiedziałem, że istnieje :-) –

Powiązane problemy