Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7でunpermitted_parametersのログ出力にcontextも含められる(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails 7でunpermitted_parametersのログ出力にcontextも含められる(翻訳)

Rails 7でunpermitted_parameters.action_controller1のペイロードが拡大され、許可されないパラメータがどのコントローラのどのアクションで受信されたかを開発者が調べられるようになりました(#41809)。

変更前

従来のRailsでは、許可されないパラメータがリクエストで見つかると、許可されていないキーに関する情報しかログ出力されず、許可されないパラメータがどのコントローラのどのアクションで受信されたのかを開発者が知るための情報が不十分でした。

以下のコードで考えてみましょう。Userにはname属性、email属性、role属性があり、このうちname属性とemail属性のみ許可されています。

request_params = { user: { name: "Francesco", email: "fransceso@example.com", role: "admin" } }

params = ActionController::Parameters.new(request_params)
params.permit(user: [:name, :email])

# Unpermitted parameter: :role

ログでわかるのは、許可されないキーの情報のみであり、許可されないパラメータを受信したコントローラとアクションに関する情報を取れませんでした。

変更後

Rails 7では、呼び出し元がcontextcontrollerキー、actionキー、paramsキー、requestキーを渡すと、このcontextもログ出力のペイロードに含まれるようになります。

これにより、ActionController::Parameterscontextをパラメータとして受け取れるようになります。

context = { controller: self.class.name, action: action_name }
request_params = { user: { name: "Francesco", email: "fransceso@example.com", role: "admin" } }

params = ActionController::Parameters.new(request_params, context)
params.permit(user: [:name, :email])

# Unpermitted parameter: :role. Context: { controller: UsersController, action: create }

許可されないパラメータに加えて、コントローラやアクションもログ出力されていることがわかります。contextが渡されない場合は、空のコンテキストがペイロードに含まれます。

request_params = { user: { name: "Francesco", email: "fransceso@example.com", role: "admin" } }

params = ActionController::Parameters.new(request_params)
params.permit(user: [:name, :email])

# Unpermitted parameter: :role. Context: { }

原注: この変更は、ログ出力のコンテキストを呼び出し元が提供することを期待しています。

関連記事

Rails 7のenumに新しい構文が導入(翻訳)


  1. 訳注: これはActive Support Instrumentationのフックです。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。