少し古い質問ですが、私は今日自分自身でこれと戦いました。ここで私が思いついた答えは次のとおりです。これは少しjQueryのせいだと思いますが、それは自然なことをしているにすぎません。ただし、回避策はあります。
次のjQuery ajax呼び出しがあるとします。
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
});
jQueryが投稿する値は、次のようなものになります(Firebug-of-choiceでリクエストを見ると)、次のようなフォームデータが得られます。
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
あなたが得るCGI.unencodeの場合
shared_items[0][entity_id]:1
shared_items[0][position]:1
これは、jQueryがJSONのこれらのキーはフォーム要素名であり、「user [name]」という名前のフィールドがあるかのようにそれらを処理する必要があると考えているためと考えています。
したがって、Railsアプリに入力すると、Railsが角かっこを見て、フィールド名の最も内側のキー(jQueryが「効果的に」追加した「1」)を保持するハッシュを作成します。
とにかく、私は私のajax呼び出しを次のように作成することでこの動作を回避しました。
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"data": JSON.stringify({"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}])},
}
});
これにより、jQueryはこのJSONを完全に渡したい値であり、すべてのキーをフォームフィールド名に変換する必要のあるJavaScriptオブジェクトではないと考えるように強制します。
ただし、これは、Rails側では少し異なります。params[:data]でJSONを明示的にデコードする必要があるためです。
しかし、それは問題ありません:
ActiveSupport::JSON.decode( params[:data] )
TL; DR:したがって、解決策は次のとおりです。jQuery.ajax()呼び出しのデータパラメーターで{"data": JSON.stringify(my_object) }
、JSON配列をjQueryにフィードするのではなく、明示的に行います(そこで何をしたいかを誤って推測します)。