Rails 7でunpermitted_parametersのログ出力にcontextも含められる(翻訳)
Rails 7でunpermitted_parameters.action_controller
1のペイロードが拡大され、許可されないパラメータがどのコントローラのどのアクションで受信されたかを開発者が調べられるようになりました(#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では、呼び出し元がcontext
にcontroller
キー、action
キー、params
キー、request
キーを渡すと、このcontext
もログ出力のペイロードに含まれるようになります。
これにより、ActionController::Parameters
がcontext
をパラメータとして受け取れるようになります。
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: { }
原注: この変更は、ログ出力のコンテキストを呼び出し元が提供することを期待しています。
関連記事
- 訳注: これはActive Support Instrumentationのフックです。 ↩
概要
原著者の許諾を得て翻訳・公開いたします。