adam
Path Helpers and form_for
I have run into an issue when using path helpers in a form_for function when trying to edit a resource. In this case I am trying to update an existing resource.
The router kicks out the following
categories_path GET /categories MyApp.CategoriesController :index
categories_path POST /categories MyApp.CategoriesController :create
categories_path PATCH /categories/:id MyApp.CategoriesController :update
PUT /categories/:id MyApp.CategoriesController :update
My form_for opens as
<%= form_for(@client_changeset, categories_path(@conn, :update, @client), fn f -> %>
(the categories controller handles submissions for both clients and topics as they are the ‘categories’)
My understanding is, providing a changeset for an existing resource to form_for means the submission would be a POST to
/categories/<id of resource>
with
“_method” => “put” (or “patch”)?
I then take the params where I can use the id for fetching the resource from storage then sending that along with the client params for the update.
However. If I set up the form_for as shown I always get the error,
protocol Enumerable not implemented for %MyApp.Client{... etc }
If I remove the @client from the call to categories_path the error goes away, but the form submission does not include an id in the path.
Revised form_for
<%= form_for(@client_changeset, categories_path(@conn, :update), fn f -> %>
POSTs to
/categories
As a workaround I have added the id @client.id as a hidden field on the form so I can pluck it from the params. This however feels wrong and hacky, and doesn’t align with the boilerplate code a phoenix generator produces or my understanding of the path_helper included in the form_for action.
I’ve checked the categories_path in iex and I can pass
categories_path(MyApp.Endpoint, :update, Repo.get(Client, 1))
and it returns
"/categories/1"
as it should.
Any help here would be greatly appreciated. Thanks.
Marked As Solved
NobbZ
Just to be sure the parser isn’t irritated, have you tried form for without parentheses?
Also Liked
amnu3387
It’s either gnomes or robots you never know
amnu3387
It should be categories_path(@conn, :update, @client.id), it won’t extract the ID for you
idi527
Since categories_path/4 doesn’t exist, the third argument in categories_path/3 is an option list, so I doubt categories_path(@conn, :update, @client.id) would work since @client.id is not a list of options.
And there is usually a Phoenix.Param implementation or something like that to, in this case, extract id out of @client, so if categories_path(@conn, :update, @client.id) worked, categories_path(@conn, :update, @client) would work as well.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








