Before asking the question, I will go over how is my database structure …
Table user = user, email, password, profile_id
Profile table = first name, last name, avatar
Question:
How do I create a function inside the profile controller, to update the profile_id from the User table?
I currently did this.
But it did not work.
can you help me?
profile_controller.ex
def create(conn, %{"profile" => profile_params}) do
case Structure.create_profile(profile_params) do
{:ok, profile} ->
conn
|> ProjectWeb.ProfileController.update_profileid()
|> put_flash(:info, "Perfil criado com sucesso.")
|> redirect(to: Routes.profile_path(conn, :show, profile))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update_profileid(_, %{"id" => id}) do
profile = Structure.get_profile!(id)
user = Repo.get!(User, 1)
changeset = User.changeset(user, %{"profile_id" => profile})
Repo.update!(changeset)
end
But if you are setting up associations properly in Ecto there are other different methods for creating the links between entities (e.g. put_assoc), but you don’t need to if you are happy to update the id’s directly.
has arity 2, ie the function is ProjectWeb.ProfileController.update_profileid/2
but you are calling it with only one argument, and you are passing in the connection not the profile.
Your code should probably look something like this (although the linking of user & profile probably shouldn’t happen in your controller anyway):
alias Structure.Profile
def create(conn, %{"profile" => profile_params}) do
case Structure.create_profile(profile_params) do
{:ok, profile} ->
profile
|> ProjectWeb.ProfileController.update_profileid()
conn
|> put_flash(:info, "Perfil criado com sucesso.")
|> redirect(to: Routes.profile_path(conn, :show, profile))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def update_profileid(%Profile{}=profile) do
user = Repo.get!(User, 1)
changeset = User.changeset(user, %{"profile_id" => profile.id})
Repo.update!(changeset)
end