I’m a beginner with phoenix and liveview and I started a personal project called “Builders”. After run the
mix phx.gen.live
command for a Project entitie and run mix ecto.migrate
I open my browser in http://localhost:4000/projects/new and see the error:
KeyError at GET /projects/new
Exception:
** (KeyError) key :name not found in: %{__changed__: nil, __given__: %{__changed__: nil, field: %Phoenix.HTML.FormField{id: "project_title", name: "project[title]", errors: [], field: :title, form: %Phoenix.HTML.Form{source: #Ecto.Changeset<action: nil, changes: %{}, errors: [title: {"can't be blank", [validation: :required]}, user_id: {"can't be blank", [validation: :required]}, budget: {"can't be blank", [validation: :required]}, description: {"can't be blank", [validation: :required]}], data: #Builders.Jobs.Project<>, valid?: false>, impl: Phoenix.HTML.FormData.Ecto.Changeset, id: "project", name: "project", data: %Builders.Jobs.Project{__meta__: #Ecto.Schema.Metadata<:built, "public", "projects">, id: nil, budget: nil, description: nil, title: nil, user_id: nil, created_at: nil, updated_at: nil}, hidden: [], params: %{}, errors: [], options: [method: "post"], index: nil, action: nil}, value: nil}, label: "Title", type: "text"}, field: %Phoenix.HTML.FormField{id: "project_title", name: "project[title]", errors: [], field: :title, form: %Phoenix.HTML.Form{source: #Ecto.Changeset<action: nil, changes: %{}, errors: [title: {"can't be blank", [validation: :required]}, user_id: {"can't be blank", [validation: :required]}, budget: {"can't be blank", [validation: :required]}, description: {"can't be blank", [validation: :required]}], data: #Builders.Jobs.Project<>, valid?: false>, impl: Phoenix.HTML.FormData.Ecto.Changeset, id: "project", name: "project", data: %Builders.Jobs.Project{__meta__: #Ecto.Schema.Metadata<:built, "public", "projects">, id: nil, budget: nil, description: nil, title: nil, user_id: nil, created_at: nil, updated_at: nil}, hidden: [], params: %{}, errors: [], options: [method: "post"], index: nil, action: nil}, value: nil}, inner_block: [], label: "Title", multiple: false, prompt: nil, rest: %{}, type: "text"}
(builders 0.1.0) lib/builders_web/components/core_components.ex:350: anonymous fn/2 in BuildersWeb.CoreComponents."input (overridable 1)"/1
(builders 0.1.0) /home/danubio/Documentos/projetos/builders/lib/builders_web/live/project_live/form_component.ex:24: BuildersWeb.ProjectLive.FormComponent.render/1
(elixir 1.14.2) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:396: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:544: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.14.2) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:396: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:544: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.14.2) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:396: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:544: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.14.2) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:396: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:544: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.14.2) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:396: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:717: Phoenix.LiveView.Diff.render_component/9
(phoenix_live_view 0.18.18) lib/phoenix_live_view/diff.ex:662: anonymous fn/5 in Phoenix.LiveView.Diff.render_pending_components/6
My lib/builders_web/live/project_live/form_component.ex
is this:
@impl true
def render(assigns) do
assigns |> dbg()
~H"""
<div>
<.header>
<%= @title %>
<:subtitle>Use this form to manage project records in your database.</:subtitle>
</.header>
<.simple_form
for={@form}
id="project-form"
phx-target={@myself}
phx-change="validate"
phx-submit="save"
>
<.input field={@form[:title]} type="text" label="Title" />
<.input field={@form[:user_id]} type="text" label="User" />
<.input field={@form[:budget]} type="number" label="Budget" step="any" />
<.input field={@form[:description]} type="text" label="Description" />
<:actions>
<.button phx-disable-with="Saving...">Save Project</.button>
</:actions>
</.simple_form>
</div>
"""
end
The error came from this function in lib/builders_web/components/core_components.ex
:
def input(assigns) do
~H"""
<div phx-feedback-for={@name}>
<.label for={@id}><%= @label %></.label>
<input
type={@type}
name={@name}
id={@id || @name}
value={@value}
class={[
input_border(@errors),
"mt-2 block w-full rounded-lg border-zinc-300 py-[7px] px-[11px]",
"text-zinc-900 focus:outline-none focus:ring-4 sm:text-sm sm:leading-6",
"phx-no-feedback:border-zinc-300 phx-no-feedback:focus:border-zinc-400 phx-no-feedback:focus:ring-zinc-800/5"
]}
{@rest}
/>
<.error :for={msg <- @errors}><%= msg %></.error>
</div>
"""
end
I’m using phoenix in 1.7.0
and liveview in 0.18.3
Anyone can help me with this or explain me the reason error?