1. ホーム
  2. jquery

[解決済み] RailsがjQueryからのJSONを正しくデコードしない(配列が整数のキーを持つハッシュになる)。

2023-03-12 05:07:21

質問

JSONオブジェクトの配列をjQueryでRailsにPOSTしようとすると、いつもこの問題が発生します。 配列を文字列化すると、jQueryが正しく動作していることがわかります。

"shared_items"=>"[{\"entity_id\":\"253\",\"position\":1},{\"entity_id\":\"823\",\"position\":2}]"

しかし、私はちょうど私がAJAXの呼び出しのデータとしてそれを配列に送信する場合、私は得る。

"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}

一方、プレーンな配列を送るとうまくいきます。

"shared_items"=>["entity_253"]

なぜRailsは配列をあの奇妙なハッシュに変えているのでしょうか?思い当たる理由は、ここに型がないのでRailsが内容を正しく理解できないからです(jQueryの呼び出しで設定する方法があるのでしょうか)。

Processing by SharedListsController#create as 

ありがとうございました。

更新しました。 データを文字列ではなく、配列として送信し、配列は動的に .push() 関数を使用して動的に作成されています。試しに $.post$.ajax を指定しても、同じ結果になります。

どのように解決するのですか?

この問題に遭遇した人がよりよい解決策を求めている場合、.ajax 呼び出しで "contentType.を指定することができます。'application/json'" オプションを .ajax 呼び出しで指定すると、Rails は JSON オブジェクトを整数キー ハッシュとすべての文字列値に分解せずに適切にパースします。

つまり、要約すると、私の問題は、このようなことでした。

$.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}]}
});

のように、Railsが解析する結果となりました。

Parameters: {"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}}

ここで、次のようにします(注:現在、javascriptオブジェクトを文字列化し、コンテンツタイプを指定しているので、railsはこの文字列をどのようにパースするのかがわかります)。

$.ajax({
  type : "POST",
  url :  'http://localhost:3001/plugin/bulk_import/',
  dataType: 'json',
  contentType: 'application/json',
  data : JSON.stringify({"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]})
});

の結果は、Railsの素敵なオブジェクトになります。

Parameters: {"shared_items"=>[{"entity_id"=>"253", "position"=>1}, {"entity_id"=>"823", "position"=>2}]}

これはRails 3、Ruby 1.9.3で動作しています。