在控制器渲染JSON(Rendering JSON in controller)

2019-07-19 18:11发布

我在读一本书,并在约当谈到渲染的东西,为JSON它有一个例子是这样,但不进去的细节,所以我无法弄清楚大局观,这个例子在适合控制器章节:

render :json => @projects, :include => tasks

而且还用它与回调函数的一些示例与JSONP:

render :json => @record, :callback => 'updateRecordDisplay'

有人能解释这些?

Answer 1:

你会通常会返回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)请求,从servicesapi 。 人的方式都是围绕这个限制(在之前偷偷跨来源资源共享规范定稿 )是由服务器通过发送JSON数据,如果它是JavaScript的,而不是JSON)。 因此,而不是发送回:

{"name": "John", "age": 45}

在服务器,而不是将发回:

valueOfCallbackHere({"name": "John", "age": 45})

因此,客户机侧应用程序JS可以创建一个script标签指着api.yoursite.com/your/endpoint?name=John并具有valueOfCallbackHere 调用函数 (这将具有在客户端JS待定) 从这个其他来源的数据 。)



Answer 2:

究竟你想知道些什么? 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存在其他技术。



Answer 3:

对于实例

render :json => @projects, :include => :tasks

就表示要渲染@projects作为JSON和包括联想tasks上导出数据的项目模型。

对于实例

render :json => @projects, :callback => 'updateRecordDisplay'

就表示要渲染@projects为JSON,并包裹在JavaScript调用,数据将呈现有点像:

updateRecordDisplay({'projects' => []})

这使得数据被发送到父窗口和旁路跨站点伪造问题。



文章来源: Rendering JSON in controller