98 json ruby-on-rails ruby-on-rails-3.2
我正在阅读一本书和关于控制器的章节,当它讨论渲染内容时,对于JSON,它有一个这样的例子,但没有详细说明,所以我无法弄清楚这个例子适合的大局:
render :json => @projects, :include => tasks
Run Code Online (Sandbox Code Playgroud)
还有JSONP使用回调函数的一些例子:
render :json => @record, :callback => 'updateRecordDisplay'
Run Code Online (Sandbox Code Playgroud)
有人能解释一下吗?
Sea*_*ira 119
您通常会返回JSON,因为:
A)您将部分/全部应用程序构建为单页面应用程序(SPA),并且您需要使用客户端JavaScript才能在不完全重新加载页面的情况下提取其他数据.
要么
B)您正在构建第三方将消耗的API,并且您决定使用JSON来序列化您的数据.
或者,您可能正在吃自己的狗食并同时做这两种情况
在这两种情况下,render :json => some_dataJSON-ify都会提供数据.:callback第二个示例中的关键点需要更多解释(见下文),但它是同一想法的另一种变体(以JavaScript可以轻松处理的方式返回数据).
:callback?JSONP(第二个示例)是一种绕过同源策略的方法,该策略是每个浏览器内置安全性的一部分.如果你有你的API api.yoursite.com,您将服务应用程序关闭的services.yoursite.com您的JavaScript不会(默认)能够使XMLHttpRequest(XHR -又名AJAX)从请求services到api.人们一直在寻找限制(在最终确定跨源资源共享规范之前)的方式是通过从服务器发送JSON数据,就像它是JavaScript而不是JSON一样.因此,而不是发回:
{"name": "John", "age": 45}
Run Code Online (Sandbox Code Playgroud)
服务器将发回:
valueOfCallbackHere({"name": "John", "age": 45})
Run Code Online (Sandbox Code Playgroud)
因此,客户端JS应用程序可以创建一个script标记,该标记指向api.yoursite.com/your/endpoint?name=John并具有使用来自该另一个源的数据valueOfCallbackHere调用的函数(必须在客户端JS中定义).)
Max*_*Max 64
你究竟想知道什么?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
Run Code Online (Sandbox Code Playgroud)
现在,如果我们使用jQuery进行AJAX调用,如下所示:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们设法从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
Run Code Online (Sandbox Code Playgroud)
现在我们可以按如下方式创建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);
Run Code Online (Sandbox Code Playgroud)
使用这种回调的动机通常是绕过限制跨源资源共享(CORS)的浏览器保护.然而,JSONP不再那么用了,因为存在其他技术来绕过更安全,更容易的CORS.
Kel*_*lly 15
对于的例子
render :json => @projects, :include => :tasks
Run Code Online (Sandbox Code Playgroud)
您声明要渲染@projects为JSON,并tasks在导出的数据中包含Project模型的关联.
对于的例子
render :json => @projects, :callback => 'updateRecordDisplay'
Run Code Online (Sandbox Code Playgroud)
您声明要渲染@projects为JSON,并将该数据包装在javascript调用中,该调用将呈现如下:
updateRecordDisplay({'projects' => []})
Run Code Online (Sandbox Code Playgroud)
这允许将数据发送到父窗口并绕过跨站点伪造问题.