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