Biraz eski bir soru, ama bugün bununla kendim mücadele ettim ve işte bulduğum cevap: Bunun biraz jQuery'nin hatası olduğuna inanıyorum, ama sadece doğal olanı yapmak. Bununla birlikte, bir çözümüm var.
Aşağıdaki jQuery ajax çağrısı verildiğinde:
$.ajax({
type : "POST",
url : 'http:
dataType: 'json',
data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
});
JQuery'nin göndereceği değerler şuna benzer şekilde görünecektir (Firebug-tercihinizdeki İsteğe bakarsanız) size aşağıdaki gibi görünen form verilerini verecektir:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Eğer alacağınız CGI.unencode
shared_items[0][entity_id]:1
shared_items[0][position]:1
Bunun nedeni, jQuery'nin JSON'nizdeki bu anahtarların form öğesi adları olduğunu ve onlara "kullanıcı [ad]" adlı bir alanınız varmış gibi davranması gerektiğini düşünmesinden kaynaklandığına inanıyorum.
Böylece, Rails uygulamanıza gelirler, Rails parantezleri görür ve alan adının en içteki anahtarını tutmak için bir karma oluşturur (jQuery'nin "yararlı" eklediği "1").
Her neyse, ajax çağrımı şu şekilde oluşturarak bu davranışı aştım;
$.ajax({
type : "POST",
url : 'http:
dataType: 'json',
data : {"data": JSON.stringify({"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}])},
}
});
Hangi güçler jQuery bu JSON bir olduğunu düşünmek değer Eğer tamamen ve geçmek istediğiniz değil alması gereken bir Javascript nesnesi ve tüm anahtarları form alanı adlarına dönüştürür.
Bununla birlikte, bu, Rails tarafında işlerin biraz farklı olduğu anlamına gelir, çünkü JSON'un şifresini params [: data] içinde açıkça çözmeniz gerekir.
Ama sorun değil:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Yani çözüm şudur: jQuery.ajax () çağrınızın data parametresinde {"data": JSON.stringify(my_object) }
, JSON dizisini jQuery'ye beslemek yerine açıkça yapın (burada, onunla ne yapmak istediğinizi yanlış tahmin eder.