Hello guys, I want to build a form that will make me edit information about Post. Post has title, description and short bullet points, that are associated with the post through one to many relationship. Weird thing is that it works when I want to edit a post that has bullet points, but when creating new one or editing post without bullets, it does not work.
This is my form component:
@impl true
def render(assigns) do
~H"""
<div>
<.header>
<%= @title %>
<:subtitle>Użyj tego formularza aby dodać nowego posta</:subtitle>
</.header>
<.simple_form
for={@form}
id="post-form"
phx-target={@myself}
phx-change="validate"
phx-submit="save"
>
<.input field={@form[:title]} type="text" label="Tytuł" />
<.input field={@form[:description]} type="textarea" label="Opis (do 1000 znaków)" />
<fieldset>
<.inputs_for :let={bullet_form} field={@form[:bullet_points]}>
<.input type="text" field={bullet_form[:content]} label="Bullet" />
</.inputs_for>
</fieldset>
<:actions>
<.button phx-disable-with="Saving...">Add Post</.button>
</:actions>
</.simple_form>
</div>
"""
end
@impl true
def update(%{post: post} = assigns, socket) do
changeset = Articles.change_post(post)
{:ok,
socket
|> assign(assigns)
|> assign_form(changeset)}
end
@impl true
def handle_event("validate", %{"post" => post_params}, socket) do
changeset =
socket.assigns.post
|> Articles.change_post(post_params)
|> Map.put(:action, :validate)
{:noreply, assign_form(socket, changeset)}
end
def handle_event("save", %{"post" => post_params}, socket) do
save_question(socket, socket.assigns.action, post_params)
end
defp save_question(socket, :edit, post_params) do
case Articles.update_post(socket.assigns.post, post_params) do
{:ok, post} ->
notify_parent({:saved, post})
{:noreply,
socket
|> put_flash(:info, "Post updated successfully")
|> push_patch(to: socket.assigns.patch)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign_form(socket, changeset)}
end
end
defp save_question(socket, :new, post_params) do
case Articles.create_post(post_params) do
{:ok, post} ->
notify_parent({:saved, post})
{:noreply,
socket
|> put_flash(:info, "Post created successfully")
|> push_patch(to: socket.assigns.patch)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign_form(socket, changeset)}
end
end
defp assign_form(socket, %Ecto.Changeset{} = changeset) do
assign(socket, :form, to_form(changeset))
end
defp notify_parent(msg), do: send(self(), {__MODULE__, msg})