我在读一本书,并在约当谈到渲染的东西,为JSON它有一个例子是这样,但不进去的细节,所以我无法弄清楚大局观,这个例子在适合控制器章节:
render :json => @projects, :include => tasks
而且还用它与回调函数的一些示例与JSONP:
render :json => @record, :callback => 'updateRecordDisplay'
有人能解释这些?
我在读一本书,并在约当谈到渲染的东西,为JSON它有一个例子是这样,但不进去的细节,所以我无法弄清楚大局观,这个例子在适合控制器章节:
render :json => @projects, :include => tasks
而且还用它与回调函数的一些示例与JSONP:
render :json => @record, :callback => 'updateRecordDisplay'
有人能解释这些?
你会通常会返回JSON或者是因为:
A)您正在建设的部分/所有的应用程序作为一个单页应用(SPA)和您需要的客户端JavaScript能在更多的数据拉不完全重新加载页面。
要么
B)你需要建立第三方将消耗一个API,并且您已经决定使用JSON序列化数据。
或者,也许,你是吃自己的狗食和做两个
在两种情况下render :json => some_data
将JSON-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}
在服务器,而不是将发回:
valueOfCallbackHere({"name": "John", "age": 45})
因此,客户机侧应用程序JS可以创建一个script
标签指着api.yoursite.com/your/endpoint?name=John
并具有valueOfCallbackHere
调用函数 (这将具有在客户端JS待定) 从这个其他来源的数据 。)
究竟你想知道些什么? ActiveRecord的有记录的序列化JSON进入方法。 例如,打开你的轨道控制台,然后输入ModelName.all.to_json
,你会看到JSON输出。 render :json
本质要求to_json
并将结果返回到正确的标题浏览器。 对于AJAX在JavaScript要返回JavaScript对象使用调用这是有用的。 此外,还可以使用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存在其他技术。
对于实例
render :json => @projects, :include => :tasks
就表示要渲染@projects
作为JSON和包括联想tasks
上导出数据的项目模型。
对于实例
render :json => @projects, :callback => 'updateRecordDisplay'
就表示要渲染@projects
为JSON,并包裹在JavaScript调用,数据将呈现有点像:
updateRecordDisplay({'projects' => []})
这使得数据被发送到父窗口和旁路跨站点伪造问题。