menu = Cms.Content.create_menu(%{name: "Test Menu"})
What’s returned from Cms.Content.create_menu/1
? Is it {:ok, menu}
?
I would probably avoid casting foreign keys in changesets (can open you up for vulnerabilities if attrs
come from user input), but pass them to the create function “manually”.
@spec create_menu_item(map, for: %Menu{}) :: {:ok, %MenuItem{}} | {:error, Ecto.Changeset.t()}
def create_menu_item(attrs, for: %Menu{id: menu_id}) do
%MenuItem{menu_id: menu_id}
|> MenuItem.changeset(attrs)
|> Repo.insert()
end
# for menu item
def changeset(%MenuItem{} = menu_item, attrs) do
menu_item
|> cast(attrs, [:name])
# |> put_assoc(:menu, [attrs.menu])
|> validate_required([:name, :menu])
|> unique_constraint(:name, message: "Name is already taken.")
|> unique_constraint(:order, message: "Order number is already taken.")
end
Usage
{:ok, %Menu{} = menu} = create_menu(%{name: "Test Menu"})
{:ok, %MenuItem{} = menu_item} = create_menu_item(%{name: "Test Item"}, for: menu)