動かざることバグの如し

近づきたいよ 君の理想に

Rails8からstrong parametersの書き方が変わったのは何故か

環境

  • 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で一括自動修正ができる

docs.rubocop.org

ただし破壊的な変更を伴うかもしれないので rubocop -A でのみ反映可能

参考リンク