adam
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.
Trending in Questions
Other Trending 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
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixir-ls
- #elixirconf-us
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 9- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
idi527
What error do you get if you try
?
Can you show the code you use to generate the routes for categories?
adam
I get
router.ex for categories reads
NobbZ
Just to be sure the parser isn’t irritated, have you tried form for without parentheses?
amnu3387
It should be
categories_path(@conn, :update, @client.id), it won’t extract the ID for youidi527
Since
categories_path/4doesn’t exist, the third argument incategories_path/3is an option list, so I doubtcategories_path(@conn, :update, @client.id)would work since@client.idis not a list of options.And there is usually a
Phoenix.Paramimplementation or something like that to, in this case, extractidout of@client, so ifcategories_path(@conn, :update, @client.id)worked,categories_path(@conn, :update, @client)would work as well.amnu3387
nevermind - now it works for me without id too, must be the gnomes
adam
Nobbz,
I appreciate you answering. Total face-palm moment.
The page has two forms on it, for the two categories. I was (like a complete fool) reading the error message which was about the second form while making changes to the first one!
Adding and removing parentheses finally woke me up to this as the stacktrace showed parens still in place. THAT’S WHEN I REALIZED.
Sorry to have wasted everyone’s time…
adam
See my note about me being a total fool, but, just FYI it works for me just using
client, I don’t need to add the.idNow I need to work on my stack trace reading skills.
amnu3387
It’s either gnomes or robots you never know