Bạn muốn biết chính xác những gì? ActiveRecord có các phương thức tuần tự hóa các bản ghi thành JSON. Ví dụ: mở bảng điều khiển rails của bạn và nhập ModelName.all.to_json
và bạn sẽ thấy đầu ra JSON. render :json
về cơ bản gọi to_json
và trả về kết quả cho trình duyệt với các tiêu đề chính xác. Điều này hữu ích cho các cuộc gọi AJAX trong JavaScript mà bạn muốn trả về các đối tượng JavaScript để sử dụng. Ngoài ra, bạn có thể sử dụng callback
tùy chọn để chỉ định tên của lệnh gọi lại mà bạn muốn gọi qua JSONP.
Ví dụ, giả sử chúng ta có một User
mô hình giống như sau:{name: 'Max', email:' m@m.com'}
Chúng tôi cũng có một bộ điều khiển trông giống như sau:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
Bây giờ, nếu chúng ta thực hiện một cuộc gọi AJAX bằng jQuery như sau:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
Như bạn có thể thấy, chúng tôi đã quản lý để lấy Người dùng có id 5 từ ứng dụng rails của chúng tôi và sử dụng nó trong mã JavaScript của chúng tôi vì nó được trả về dưới dạng đối tượng JSON. Tùy chọn gọi lại chỉ gọi một hàm JavaScript của tên được truyền với đối tượng JSON làm đối số đầu tiên và duy nhất.
Để đưa ra ví dụ về callback
tùy chọn, hãy xem phần sau:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
Bây giờ chúng ta có thể đóng một yêu cầu JSONP như sau:
function testFunction(data) {
alert(data.name); // Will alert Max
};
var script = document.createElement("script");
script.src = "/users/5";
document.getElementsByTagName("head")[0].appendChild(script);
Động cơ để sử dụng lệnh gọi lại như vậy thường là để phá vỡ các biện pháp bảo vệ của trình duyệt hạn chế chia sẻ tài nguyên nguồn gốc chéo (CORS). Tuy nhiên, JSONP không còn được sử dụng nhiều nữa vì các kỹ thuật khác tồn tại để vượt qua CORS an toàn hơn và dễ dàng hơn.