arcyfelix
Phoenix Update Behavior from Gen.JSON
Hi,
I am quite new to Phoenix and Elixir, but I love it already.
I just want to make sure the behavior I have observed is correct.
I use Phoenix 1.4.
I want to create a REST server.
- I created an app and installed all dependencies:
mix phx.new my-app --app my_app --no-html --no-webpack
- Created the DB:
cd my-app
mix ecto.create
- Generated a Product Schema
mix phx.gen.context Operations Product products product_name:string in_in_stock:boolean quantity:integer
- Then, migration:
mix ecto.migrate
- I generate a JSON CRUD with --no-context and --no-schema, since we already have them available:
mix phx.gen.json Operations Product products product_name:string in_in_stock:boolean quantity:integer --no-context --no-schema
- I add recommended resource endpoints to the router in the /api scope:
resources "/products", ProductController
- Then, I start the server in the dev mode with the local DB:
mix phx.server
- Finally, I can create the creation endpoint (by default all parameters are required):
a) all parameters supplied - SUCCESS!
curl -H "Content-Type: application/json" -X POST -d '{"product":{"product_name":"Product1","in_in_stock":true, "quantity": 1}}' http://localhost:4000/api/products
b) missing one required parameter - FAILURE! (Correct behavior!)
curl -H "Content-Type: application/json" -X POST -d '{"product":{"product_name":"Product1","in_in_stock":true, "quantity1": 1}}' http://localhost:4000/api/products
- Here is when I am a little puzzled: PUT. I send a PUT request where none of the parameters in the body are correct and I get status 200OK, but the product does not change at all.
curl -H "Content-Type: application/json" -X PUT -d '{"product":{"product_name1":"Product1","in_in_stock1":true, "quantity1": 1}}' http://localhost:4000/api/products/1
Shouldn’t that return an error?
I tried changing Repo.update() to Repo.update!() in my_app/operations/operations.ex but it fails even with the correct data now.
How can I make sure that atleast one parameter (if not all that are supplied) are correct? How could I enforce all required parameters being passed in the PUT request?
What is the best practise?
Regards
Wojciech
Marked As Solved
kokolegorille
You will need to make your custom validation in that case, because it’s not the default behaviour…
Those 2 points are valid in the Phoenix way, because, when updating, You rely on existing data. And it is also the case in Rails, and probably more frameworks…
Also Liked
kokolegorille
To force product_name presence, You should add a validation to your changeset.
And there should be no redirection with json api. Instead, you should render a json error.
kokolegorille
Because the keys You use are not in the changeset, it will cast nothing, and change nothing. Cast will simply discard wrong keys.
Try to change
"in_in_stock1":true
to
"in_in_stock":"WRONG DATA"
then it should fail, I think… or provide values that does not pass validation.
or simply provide new values to right keys, and see if it changes the record ![]()
Providing wrong keys should result in a successful update, because there is nothing to change, this might be why You have a 200 status.
kokolegorille
You should use cast, it’s just expected that wrong keys are silently discarded.
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








