Thanks so far… as a beginner I need more understanding, can not transfer that sample into my case.
In a non immutable language like ruby it is a nobrainer:
You might also show how You cast your attributes in your changeset. Somethink like this
@required_fields ~w(name email)a
def changeset(%User{} = user, attrs \\ %{}) do
user
|> cast(attrs, @required_fields)
...
It acts like white listing attributes in Ruby (params…permit etc). You might allow user_id in profile changeset, although it is better to set keys through association.
def create(conn, %{"angebot" => angebot_params}) do
current_user = conn.assigns.current_user
#you can do as ruby elixir is not fully immutable. Elixir can rebound
angebot_params = Map.put(angebot_params, "user_id", current_user.id)
case Projects.create_angebot(angebot_params) do
{:ok, angebot} ->
conn
|> put_flash(:info, "Angebot created successfully.")
|> redirect(to: edit_angebot_path(conn, :show, angebot))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
....
end
Today we discussed in forum about user_id in changesets. This is a better approach than allowing cast :user_id in changeset
you can look post about user_id
So for your case
def create(conn, %{"angebot" => angebot_params}) do
current_user = conn.assigns.current_user
case Projects.create_angebot(angebot_params, current_user) do
{:ok, angebot} ->
conn
|> put_flash(:info, "Angebot created successfully.")
|> redirect(to: edit_angebot_path(conn, :show, angebot))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
....
end
#lip/projects/projects.ex
def create_angebot(attrs, %User{id: user_id}) do
%Angebot{user_id: user_id}
|> Angebot.changeset(attrs)
|> Repo.insert()
end
#lip/projects/angebot.ex
#and delete cast :user_id in changeset function
|> cast(attrs, [:title, :subtitle, :content, :online, :since, :zip, :city, :country])