你到底想知道什么? ActiveRecord 具有将记录序列化为 JSON 的方法。例如,打开您的 Rails 控制台并输入 ModelName.all.to_json,您将看到 JSON 输出。 render :json 本质上是调用to_json 并将结果返回到带有正确标题的浏览器。这对于您希望返回 JavaScript 对象以供使用的 JavaScript 中的 AJAX 调用很有用。此外,您可以使用callback 选项指定您希望通过 JSONP 调用的回调的名称。
例如,假设我们有一个看起来像这样的User 模型:{name: 'Max', email:' m@m.com'}
我们还有一个如下所示的控制器:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
现在,如果我们像这样使用 jQuery 进行 AJAX 调用:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
如您所见,我们设法从 Rails 应用程序中获取 ID 为 5 的用户,并在我们的 JavaScript 代码中使用它,因为它是作为 JSON 对象返回的。回调选项只是调用以 JSON 对象作为第一个也是唯一的参数传递的命名的 JavaScript 函数。
要给出callback 选项的示例,请查看以下内容:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
现在我们可以按如下方式创建 JSONP 请求:
function testFunction(data) {
alert(data.name); // Will alert Max
};
var script = document.createElement("script");
script.src = "/users/5";
document.getElementsByTagName("head")[0].appendChild(script);
使用此类回调的动机通常是为了规避限制跨源资源共享 (CORS) 的浏览器保护措施。然而,JSONP 不再使用那么多了,因为存在其他更安全、更容易绕过 CORS 的技术。