😽
action_argsを使うとリクエストに自動的にモデル名が追加される罠にハマった
経緯
- Railsで
user_informations_controller
(仮)にPOST APIを追加 - Rspecで下記の内容のjsonをリクエストするテストを書く
{ user_information: { name:ex } }
- controller内でリクエストを見るとなぜか空のjsonがリクエストされている
{ user_information: {} }
原因
action_argとparams
に対してdeep_transform_keys!(&:underscore)
を使っていたのですがそれが原因でした。
action_argsは自動的にリクエストのハッシュにモデルが追加されるので、deep_transform_keys!
実行時にリクエストされたjsonの中にモデル名と被るものがあれば上書きされてしまいます。
action_argsとは
以下のgemです。
Railsのコントーローラーのアクションにきたリクエストの中身を引数で受け取れるようになります。
action_argsのpermitsにより、リクエストされたハッシュにモデル名が自動的に追加される
以下の箇所で自動的にモデル名が追加され、結果リクエスト内容にモデル名が追加されるわけですね
def permits(*attributes, model_name: nil, **kw_attributes)
@permitted_attributes, @permitting_model_name = attributes << kw_attributes, model_name
end
回避方法
jsonで使用する名前を変更する、極力リクエストにモデル名を使うことを避けます。仕様なので……
Discussion