2016-06-14 5 views
0

Ich bin brandneu zu Phoenix/Elixir und habe Probleme beim Speichern eines Modells mit einer Associates_to Association.Speichern gehört zu Assoziationen in Phoenix

Das Setup ist, dass ich ein Benutzermodell habe, das zu einem JobTitle-Modell gehört. In der Datenbank hat der Benutzer ein Feld job_title_id. Ich aktualisiere den Benutzer mit einer JSONAPI-Eingabe und versuche, die job_title_id von 1 auf 2 zu ändern. Der Benutzer wird korrekt aktualisiert, mit Ausnahme der job_title_id, die dies nicht tut. Ich habe überprüft, dass meine attrs-Variable im Controller den korrekten Wert für job_title_id enthält, aber nicht in der Datenbank gespeichert wird. Fehle ich etwas Offensichtliches hier? Ich benutze das JAserializer-Plugin.

Vielen Dank

defmodule PhoenixSandbox.User do 
    use PhoenixSandbox.Web, :model 

    schema "users" do 
    field :name, :string 
    belongs_to :job_title, PhoenixSandbox.JobTitle 
    end 

    @required_fields ~w(name email bio) 
    @optional_fields ~w() 

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

Controller-Code:

def update(conn, %{"id" => id, "data" => data}) do 
    user = Repo.get!(User, id) 
    |> Repo.preload(:job_title) 
    attrs = JaSerializer.Params.to_attributes(data) 
    changeset = User.changeset(user, attrs) 
    case Repo.update(changeset) do 
    {:ok, user} -> 
     conn 
     |> put_status(201) 
     |> render(:show, data: user) 
    {:error, changeset} -> 
     conn 
     |> put_status(422) 
     |> render(:errors, data: changeset) 
    end 
end 

Einzelheiten der attrs Variable in der Steuerung:

%{"job_title_id" => "3", "name" => "Test 1", "type" => "user"} 

Antwort

0

hinzufügen job_title_id zur Liste der optional (oder erforderlich) params, und fügen Sie foreign_key_constraint/3 zu der Pipeline in User # changeset hinzu