थोड़ा पुराना सवाल है, लेकिन मैं आज खुद इस से लड़ता हूँ, और यहाँ जवाब मैं आया हूँ: मेरा मानना है कि यह थोड़ा jQuery का दोष है, लेकिन यह केवल वही कर रहा है जो इसके लिए स्वाभाविक है। हालाँकि, मेरे पास वर्कअराउंड है।
निम्नलिखित jQuery के अजाक्स कॉल को देखते हुए:
$.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 के मान पोस्ट कुछ इस तरह दिखाई देंगे (यदि आप अपने फायरबग-ऑफ-चॉइस में रिक्वेस्ट को देखते हैं) आपको ऐसा डेटा देगा जो दिखता है:
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 में उन कुंजियों के रूप में तत्व नाम हैं, और यह उनके साथ ऐसा व्यवहार करना चाहिए जैसे कि आपके पास "उपयोगकर्ता [नाम]" नाम का एक फ़ील्ड था।
इसलिए वे आपके रेल एप्लिकेशन में आते हैं, रेल कोष्ठक को देखता है, और फ़ील्ड नाम की अंतरतम कुंजी ("1" जो कि jQuery "सहायक रूप से" जोड़ा गया है) को होल्ड करने के लिए एक हैश का निर्माण करता है।
वैसे भी, मैं इस व्यवहार के चारों ओर अपने 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 एक ऐसा मान है जिसे आप पूरी तरह से पारित करना चाहते हैं, न कि एक जावास्क्रिप्ट ऑब्जेक्ट जिसे इसे लेना चाहिए और सभी कुंजी को फॉर्म फ़ील्ड नामों में बदलना चाहिए।
हालाँकि, इसका मतलब है कि चीजें रेल की तरफ से थोड़ी अलग हैं, क्योंकि आपको परमेसन [डेटा] में स्पष्ट रूप से JSON को डीकोड करने की आवश्यकता है।
किन्तु वह ठीक है:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: तो, समाधान यह है: आपके jQuery.ajax () कॉल के डेटा पैरामीटर में, {"data": JSON.stringify(my_object) }JSON सरणी को jQuery में फीड करने के बजाय (जहां यह गलत अनुमान लगाता है कि आप इसके साथ क्या करना चाहते हैं, स्पष्ट रूप से करें।