解決したいこと
API Testerを使って動作確認をしているのですが、createアクションなどのパラメータを送る際にエラーになってしまうので解決したいです。
発生しているエラー
| Started POST "/api/v1/users" for 172.20.0.1 at 2022-06-08 18:44:37 +0900 api_1 | Error occurred while parsing request parameters. api_1 | Contents: api_1 | api_1 | api_1 | { api_1 | "name": 'John', api_1 | "email": '123@example.com', api_1 | "password": 'foobar', api_1 | "password_confirmation": 'foobar' api_1 | } api_1 | api_1 | api_1 | Processing by Api::V1::UsersController#create as */* api_1 | Completed 400 Bad Request in 5ms (Allocations: 112) api_1 | api_1 | api_1 | api_1 | ActionDispatch::Http::Parameters::ParseError (Error occurred while parsing request parameters): api_1 | api_1 | app/controllers/api/v1/users_controller.rb:38:in `user_params' api_1 | app/controllers/api/v1/users_controller.rb:11:in `create' { "status": 400, "error": "Bad Request", "exception": "#<ActionDispatch::Http::Parameters::ParseError: Error occurred while parsing request parameters>", "traces":{ "Application Trace":[ { "exception_object_id": 21680, "id": 8, "trace": "app/controllers/api/v1/users_controller.rb:38:in `user_params'" }, { "exception_object_id": 21680, "id": 9, "trace": "app/controllers/api/v1/users_controller.rb:11:in `create'" } ], "Full Trace":[ {"exception_object_id": 21680, "id": 0, "trace": "actionpack (7.0.3) lib/action_dispatch/http/parameters.rb:96:in `rescue in parse_formatted_parameters'"…}, {"exception_object_id": 21680, "id": 1, "trace": "actionpack (7.0.3) lib/action_dispatch/http/parameters.rb:92:in `parse_formatted_parameters'"…}, {"exception_object_id": 21680, "id": 2, "trace": "actionpack (7.0.3) lib/action_dispatch/http/request.rb:390:in `block in POST'"…}, {"exception_object_id": 21680, "id": 3, "trace": "rack (2.2.3) lib/rack/request.rb:69:in `fetch'"}, {"exception_object_id": 21680, "id": 4, "trace": "rack (2.2.3) lib/rack/request.rb:69:in `fetch_header'"}, {"exception_object_id": 21680, "id": 5, "trace": "actionpack (7.0.3) lib/action_dispatch/http/request.rb:389:in `POST'"…}, {"exception_object_id": 21680, "id": 6, "trace": "actionpack (7.0.3) lib/action_dispatch/http/parameters.rb:55:in `parameters'"…}, {"exception_object_id": 21680, "id": 7, "trace": "actionpack (7.0.3) lib/action_controller/metal/strong_parameters.rb:1227:in `params'"…}, {"exception_object_id": 21680, "id": 8, "trace": "app/controllers/api/v1/users_controller.rb:38:in `user_params'"}, {"exception_object_id": 21680, "id": 9, "trace": "app/controllers/api/v1/users_controller.rb:11:in `create'"}, … {"exception_object_id": 21680, "id": 56, "trace": "actionpack (7.0.3) lib/action_dispatch/middleware/static.rb:23:in `call'"…}, {"exception_object_id": 21680, "id": 57, "trace": "rack (2.2.3) lib/rack/sendfile.rb:110:in `call'"}, {"exception_object_id": 21680, "id": 58, "trace": "actionpack (7.0.3) lib/action_dispatch/middleware/host_authorization.rb:137:in `call'"…}, {"exception_object_id": 21680, "id": 59, "trace": "rack-cors (1.1.1) lib/rack/cors.rb:100:in `call'"}, {"exception_object_id": 21680, "id": 60, "trace": "railties (7.0.3) lib/rails/engine.rb:530:in `call'"}, {"exception_object_id": 21680, "id": 61, "trace": "puma (5.6.4) lib/puma/configuration.rb:252:in `call'"}, {"exception_object_id": 21680, "id": 62, "trace": "puma (5.6.4) lib/puma/request.rb:77:in `block in handle_request'"…}, {"exception_object_id": 21680, "id": 63, "trace": "puma (5.6.4) lib/puma/thread_pool.rb:340:in `with_force_shutdown'"…}, {"exception_object_id": 21680, "id": 64, "trace": "puma (5.6.4) lib/puma/request.rb:76:in `handle_request'"}, {"exception_object_id": 21680, "id": 65, "trace": "puma (5.6.4) lib/puma/server.rb:441:in `process_client'"}, {"exception_object_id": 21680, "id": 66, "trace": "puma (5.6.4) lib/puma/thread_pool.rb:147:in `block in spawn_thread'"…} ] }
users_controller.rb
module Api module V1 class UsersController < ApplicationController def show render json: User.find(params[:id]) end def create user = User.new(user_params) if user.save render json: user else render json: user.errors, status: 422 end end def update user = User.find(params[:id]) if user.update render json: user else render json: user.errors, status: 422 end end def destroy if User.destroy(params[:id]) head :no_content else render json: {error: "Failed to destroy" }, status: 422 end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end end end
API Testerから送ったリクエスト
POSTリクエストを http://localhost:3001/api/v1/usersへ { "name": "John" , "email": "fuga@example.com", "password": "foobar" , "password_confirmation": "foobar" }
自分の考察
以下のサイトを参考にさせていただきました。
https://qiita.com/k-penguin-sato/items/adba7a1a1ecc3582a9c9
・まず、jsonの送り方が悪いのではないかと考え、
{ user:{ name: "John" , email: "fugaa@example.com", password: "foobar" , password_confirmation: "foobar"} } や { name: "John" , email: "fugaa@example.com", password: "foobar" , password_confirmation: "foobar"}
このような書き方も試してみましたがダメでした。
・エラーになるのはcreateのようなパラメータを送るときです。showアクションは上手く行きました。
・showアクションが上手く行ったことと、エラーの番号が通信に失敗したとき用に設定していた422ではなく400のBad Requestだったことを踏まえると、送るjsonの形式に間違いがあるのではないかと考えています。
何かしらアドバイスがあればよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー