😽

action_argsを使うとリクエストに自動的にモデル名が追加される罠にハマった

に公開

経緯

  1. Railsでuser_informations_controller(仮)にPOST APIを追加
  2. Rspecで下記の内容のjsonをリクエストするテストを書く
    {
    	user_information: {
    		name:ex
    	}
    }
    
  3. controller内でリクエストを見るとなぜか空のjsonがリクエストされている
    {
    	user_information: {}
    }
    

原因

action_argとparamsに対してdeep_transform_keys!(&:underscore)を使っていたのですがそれが原因でした。
action_argsは自動的にリクエストのハッシュにモデルが追加されるので、deep_transform_keys!実行時にリクエストされたjsonの中にモデル名と被るものがあれば上書きされてしまいます。

action_argsとは

以下のgemです。
Railsのコントーローラーのアクションにきたリクエストの中身を引数で受け取れるようになります。
https://github.com/asakusarb/action_args

action_argsのpermitsにより、リクエストされたハッシュにモデル名が自動的に追加される

以下の箇所で自動的にモデル名が追加され、結果リクエスト内容にモデル名が追加されるわけですね

    def permits(*attributes, model_name: nil, **kw_attributes)
      @permitted_attributes, @permitting_model_name = attributes << kw_attributes, model_name
    end

回避方法

jsonで使用する名前を変更する、極力リクエストにモデル名を使うことを避けます。仕様なので……

GitHubで編集を提案
SMARTCAMP Engineer Blog

Discussion