アレがどのように実現されてるのか、あとネストしたハッシュのキーにあたる文字列は単数形になるものなのか複数形になるものなのか、理解しておらず不思議がっていたら同僚が調べてくれた。復習がてらメモ。
結論
- 一連の仕事は 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"