環境
- Rails8
Rails8からstrong parametersの書き方が変わった
# 今までの書き方 user_params = params.require(:user).permit(:name, :email) # 新しい書き方 user_params = params.expect(user: [:name, :email])
なぜ変わったのか
主にセキュリティとエラーハンドリングの向上
セキュリティ
パラメータの構造の強制
従来の params.permit
は、指定されたキーを許可するだけで、パラメータの構造(例:ハッシュや配列)を強制しない。
対照的に、params.expect
は、期待されるパラメータの構造を明示的に定義し、異なる構造のデータが送信された場合には 400 Bad Request エラーを返すようになった。
配列の明示的な指定
permit
は、配列を指定すると、ハッシュや配列のハッシュの両方を許可するが、expect
は配列を明示的に指定しない限り、ハッシュのみを受け付けるため、セキュリティ上の曖昧さを減少させる。
エラーハンドリングの向上
500 エラーの防止
古い方法では、不正なデータ型が送信された場合に 500 エラーが発生することがあったが、expect
は不正なリクエストを 400 エラーとして明示的に返すため、エラーハンドリングが改善される。
エラーの明確化
500 エラーは非常に一般的なエラーであり、特定のエラーを抑制することが難しい。
expect
を使用することで、不正なリクエストが明確に拒否されるため、エラーの原因がより明確になる。
対応方法
rubocopで一括自動修正ができる
ただし破壊的な変更を伴うかもしれないので rubocop -A
でのみ反映可能