Câu hỏi hơi cũ, nhưng hôm nay tôi đã tự mình đấu tranh với điều này và đây là câu trả lời tôi nghĩ ra: Tôi tin rằng đây là lỗi của jQuery, nhưng nó chỉ làm những gì tự nhiên với nó. Tuy nhiên, tôi có một cách giải quyết.
Đưa ra lệnh gọi ajax jQuery sau:
$.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}]}
});
Các giá trị mà jQuery sẽ đăng sẽ trông giống như thế này (nếu bạn nhìn vào Yêu cầu trong Firebug-lựa chọn của bạn) sẽ cung cấp cho bạn dữ liệu biểu mẫu giống như sau:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
Nếu bạn CGI.unencode mà bạn sẽ nhận được
shared_items[0][entity_id]:1
shared_items[0][position]:1
Tôi tin rằng điều này là do jQuery nghĩ rằng các khóa đó trong JSON của bạn là tên phần tử biểu mẫu và nó sẽ coi chúng như thể bạn có một trường có tên "user [name]".
Vì vậy, chúng đi vào ứng dụng Rails của bạn, Rails nhìn thấy các dấu ngoặc và tạo một hàm băm để giữ khóa trong cùng của tên trường ("1" mà jQuery đã "bổ sung một cách hữu ích").
Dù sao, tôi đã giải quyết được hành vi này bằng cách xây dựng lệnh gọi ajax của mình theo cách sau;
$.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}])},
}
});
Điều này buộc jQuery nghĩ rằng JSON này là một giá trị mà bạn muốn chuyển, hoàn toàn chứ không phải là một đối tượng Javascript mà nó phải sử dụng và biến tất cả các khóa thành tên trường biểu mẫu.
Tuy nhiên, điều đó có nghĩa là mọi thứ có một chút khác biệt ở phía Rails, vì bạn cần giải mã rõ ràng JSON trong params [: data].
Nhưng không sao cả:
ActiveSupport::JSON.decode( params[:data] )
TL; DR: Vì vậy, giải pháp là: trong tham số dữ liệu cho lệnh gọi jQuery.ajax () của bạn, hãy thực hiện {"data": JSON.stringify(my_object) }
một cách rõ ràng, thay vì đưa mảng JSON vào jQuery (nơi nó đoán sai những gì bạn muốn làm với nó.