@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Rails が params をネストしてくれる仕組みは ActionController::ParamsWrapper が実現している

アレがどのように実現されてるのか、あとネストしたハッシュのキーにあたる文字列は単数形になるものなのか複数形になるものなのか、理解しておらず不思議がっていたら同僚が調べてくれた。復習がてらメモ。

結論

  • 一連の仕事は ActionController::ParamsWrapper がやっている
  • ネストされたハッシュの root key の名前は(おおざっぱにいうと)コントローラ名から切り出したモデル名の lower case になる。つまり(ほぼ)必ず singular (単数形)になると考えてよい。 参考コード1 参考コード2

以下、例。

コントローラとモデルの定義とルーティング

class User < ActiveRecord::Base
end
class UsersController < ApplicationController
end

Rails.application.routes.draw do
  resources :users
end

/users に POST リクエストで JSON を送る

$ curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{"foo":"bar"}' \
     http://localhost:3000/users

Rails のログに出力されるパラメータはこんな感じになる

Parameters: {"foo"=>"bar", "user"=>{"foo"=>"bar"}}

UsersController から user が得られる過程はだいたいこんなコードになっている

model_name = UsersController.name.sub(/Controller$/, '').classify
#=> "User"
model_klass = model_name.safe_constantize
#=> User < Object
param_root = model_klass.to_s.demodulize.underscore
#=> "user"