パラメータラッピング状態に関するドキュメント:
パラメータ ハッシュをネストされたハッシュにラップします。これにより、クライアントはルート要素を指定しなくても POST リクエストを送信できます。
どのパラメーター ハッシュがラップされているかを省略できます。Action Controllerの概要ガイドには、次の概要が記載されています。
paramsRailsは、クエリ文字列の一部として送信されるか、投稿本文の一部として送信されるかに関係なく、リクエストと共に送信されるすべてのパラメーターをハッシュで収集します。[…]query_parametersハッシュには、クエリ文字列の一部として送信されたパラメーターが含まれていますが、request_parametersハッシュには、投稿本文の一部として送信されたパラメーターが含まれています。ハッシュには、このpath_parameters特定のコントローラーとアクションにつながるパスの一部としてルーティングによって認識されたパラメーターが含まれています。
RESTful なリソースとルートを使用すると、楽しいことが起こります。has_many Bs を持つモデル A があるとします。したがって、B は外部キーを持ちますa_id。
空POST /as/1/bsのペイロードがあります (B には他のフィールドがないため)。a_idがであると仮定すると、 がオブジェクトにラップされるattr_accessibleと想定されるかもしれません。代わりに、次のように表示されます。a_idb
Processing by BsController#create as HTML
Parameters: {"b"=>{}, "a_id" => "1"}
そのような幸運はありません。ParamsWrapperusesrequest_parameters and notが判明したparamsため、POST ペイロードに含めないa_idということは、ラップされないことを意味します。paramsURI グロビングのために にまだ含まれていることがわかり、なぜすべてのものから除外されたのか疑問に思うため、これはかなり紛らわしいです。
request_parametersここではなく使用する正当な理由はありparamsますか?
「REST 哲学」の観点からは、ペイロードにオブジェクト全体が含まれていると仮定した方がより純粋であることは理解できますが、それは基本的a_idに URI 内の が完全に無視されることを意味し、残念に思えます。
tl;dr: ParamsWrapperパラメータ ソースとして使用するrequest_parametersため、URI でグローバル化された変数はスキップされます。これはRailsのバグですか? 純粋な REST 支持者はノーと言うかもしれませんが、プラグマティズムはイエスを示唆しています。