今回はRSpecでRequest Specを書いていた際に発生したエラー「ActionDispatch::Http::Parameters::ParseError: 809」の解決方法について備忘録としてまとめておきます。POSTメソッドでパラメーターを送る際には注意が必要そうです。
概要
Request SpecでPOSTメソッドのテストコードを書こうとした場合、paramsの引数に送りたいパラメータを書くことで指定したPOSTデータを送ることができます。
post update_status_api_users_path,
params: {
user1.hashid => { status: 'done' },
user2.hashid => { status: 'reschedule', birth_on: '1990-01-01' },
user3.hashid => { status: 'cancel' }
}
上記で送りたいパラメーターは以下のような形になります。ハッシュIDをキーにし、statusとbirth_onが送られる形です。
{
"qVLh18": { "status": "done"},
"qmoh08": { "status": "reschedule", "birth_on": "1990-01-01"},
"q3BhDG": { "status": "cancel"}
}

上記のように送られたPOSTデータは、コントローラ側の「request.body.read」で中身を受け取ることができます。しかし、今回は「request.body.read」で中身を受け取ることができません。
def update_status
json_request = JSON.parse(request.body.read)
# 省略
end
エラー内容
先ほどの「request.body.read」で中身を受け取れているか確認したところ、以下のようなエラーが発生してしまいました。
def update_status
json_request = JSON.parse(request.body.read)
# 省略
end
pry> json_request
ActionDispatch::Http::Parameters::ParseError: 809: unexpected token at 'YrhXX[status]=done&qVLhX1[status]=reschedule&qVLhX1[move_in_on]=1990-01-01&qmohx0[status]=cancel'
解決方法
「ActionDispatch::Http::Parameters::ParseError: 809」が出てしまう原因は、送られてくるパラメーターがJSONではなくハッシュの形になっているためです。
これはPOSTメソッドのparams部分にto_jsonを付与し、JSONを返すようにすることで解決できます。
# params部分にto_jsonを付与
post update_status_api_users_path,
params: {
user1.hashid => { status: 'done' },
user2.hashid => { status: 'reschedule', birth_on: '1990-01-01' },
user3.hashid => { status: 'cancel' }
}.to_json
def update_status
json_request = JSON.parse(request.body.read)
# 省略
end
pry> json_request
=> {"qd7hPO"=>{"status"=>"done"}, "q3BhWD"=>{"status"=>"reschedule", "birth_on"=>"1990-01-01"}, "G9whNa"=>{"status"=>"cancel"}}
まとめ
- paramsの引数に送りたいパラメーターを記載することで、指定のパラメーターを送ることができる
- 上記で送られたパラメーターはコントローラ側の「request.body.read」で中身を受け取ることができる
- 「ActionDispatch::Http::Parameters::ParseError: 809」が出てしまう原因は、送られてくるパラメーターがJSONではなくハッシュになっているためである
- params部分にto_jsonを付与することで解決できる
参考
Testing POST ActionDispatch::Http::Parameters::ParseError: 765
今回はRequest Specを書いていた際に発生したエラー「ActionDispatch::Http::Parameters::ParseError: 809」の解決方法についてまとめました。同様のエラーはよく見かけるので、その場合はJSONの形が正しいかどうかを確かめましょう。