RSpec

【RSpec】ActionDispatch::Http::Parameters::ParseError: 809の解決方法

RSpec

 

今回は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"}
}
Rails
【Rails】hashid-railsを用いてIDを難読化・暗号化させる方法 今回はgem 'hashid-rails'を用いてIDを難読化・暗号化させる方法についてまとめたいと思います。IDに数値...

 

上記のように送られた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の形が正しいかどうかを確かめましょう。