wake-up-neo.net

Rendern von JSON im Controller

Ich habe gerade ein Buch und ein Kapitel über Controller gelesen, in dem es um das Rendern von Inhalten geht. Für JSON hat es ein Beispiel wie dieses, geht aber nicht auf Details ein, sodass ich nicht herausfinden konnte, in welches Gesamtbild dieses Beispiel passt:

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

Und auch ein Beispiel mit JSONP, das es mit Rückruffunktionen verwendet:

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

Kann jemand diese erklären?

92
user1899082

Sie werden normalerweise zurückkehren JSON entweder weil:

A) Sie erstellen einen Teil/Ihre gesamte Anwendung als Single Page Application (SPA) und benötigen Ihr clientseitiges JavaScript, um zusätzliche Daten einlesen zu können, ohne die Seite vollständig neu zu laden.

oder

B) Sie erstellen eine API, die von Drittanbietern verwendet wird, und haben sich für die Verwendung von JSON zur Serialisierung Ihrer Daten entschieden.

Oder vielleicht essen Sie Ihr eigenes Hundefutter und tun beides

In beiden Fällen wird render :json => some_data Die bereitgestellten Daten JSON-fähig machen. Die Taste :callback Im zweiten Beispiel muss etwas näher erläutert werden (siehe unten), es handelt sich jedoch um eine andere Variante derselben Idee (Daten werden so zurückgegeben, dass JavaScript problemlos damit umgehen kann).

Warum :callback?

Mit JSONP (dem zweiten Beispiel) können Sie die Same Origin Policy umgehen, die Teil der integrierten Sicherheit jedes Browsers ist. Wenn Sie Ihre API bei api.yoursite.com Haben und Ihre Anwendung ab services.yoursite.com Bereitstellen, kann Ihr JavaScript (standardmäßig) nicht XMLHttpRequest (XHR - aka ajax) erstellen ) Anfragen von services an api. Die Art und Weise, wie die Leute diese Einschränkung umgangen haben (bevor die Cross-Origin Resource Sharing-Spezifikation fertiggestellt wurde ), ist das Senden der JSON-Daten vom Server , als wäre es so war JavaScript anstelle von JSON ). Also anstatt zurückzusenden:

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

der Server würde stattdessen Folgendes zurücksenden:

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

Somit könnte eine clientseitige JS-Anwendung ein script -Tag erstellen, das auf api.yoursite.com/your/endpoint?name=John Verweist, und die Funktion valueOfCallbackHere haben (die in der clientseitigen JS definiert werden müsste). genannt mit den Daten von diesem anderen Ursprung .)

116
Sean Vieira

Was willst du genau wissen? ActiveRecord verfügt über Methoden, mit denen Datensätze in JSON serialisiert werden. Öffnen Sie zum Beispiel Ihre Rails Konsole und geben Sie ModelName.all.to_json Ein, um die JSON-Ausgabe zu sehen. render :json Ruft im Wesentlichen to_json Auf und gibt das Ergebnis zurück Dies ist nützlich für AJAX Aufrufe in JavaScript, bei denen Sie JavaScript-Objekte zur Verwendung zurückgeben möchten. Außerdem können Sie die Option callback verwenden, um anzugeben den Namen des Rückrufs, den Sie über JSONP anrufen möchten.

Nehmen wir zum Beispiel an, wir haben ein User Modell, das so aussieht: {name: 'Max', email:' [email protected]'}

Wir haben auch einen Controller, der so aussieht:

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user
    end
end

Wenn wir nun mit jQuery einen AJAX aufrufen, sieht das so aus:

$.ajax({
    type: "GET",
    url: "/users/5",
    dataType: "json",
    success: function(data){
        alert(data.name) // Will alert Max
    }        
});

Wie Sie sehen, haben wir es geschafft, den Benutzer mit der ID 5 aus unserer Rails=) - App abzurufen und in unserem JavaScript-Code zu verwenden, da er als JSON-Objekt zurückgegeben wurde. Die Rückrufoption ruft nur ein JavaScript auf Funktion des mit dem JSON-Objekt als erstes und einziges Argument übergebenen Namens.

Sehen Sie sich Folgendes an, um ein Beispiel für die Option callback zu geben:

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user, callback: "testFunction"
    end
end

Jetzt können wir eine JSONP-Anfrage wie folgt erstellen:

function testFunction(data) {
    alert(data.name); // Will alert Max
};

var script = document.createElement("script");
script.src = "/users/5";

document.getElementsByTagName("head")[0].appendChild(script);

Die Motivation für die Verwendung eines solchen Rückrufs besteht in der Regel darin, die Browser-Schutzfunktionen zu umgehen, die die gemeinsame Nutzung von ursprungsübergreifenden Ressourcen (CORS) einschränken. JSONP wird jedoch nicht mehr so ​​oft verwendet, da andere Techniken zur Umgehung von CORS existieren, die sicherer und einfacher sind.

62
Max

Für die Instanz von

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

Sie geben an, dass Sie @projects Als JSON rendern möchten, und fügen den exportierten Daten die Zuordnung tasks zum Projektmodell hinzu.

Für die Instanz von

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

Sie geben an, dass Sie @projects Als JSON rendern möchten, und binden diese Daten in einen JavaScript-Aufruf ein, der ungefähr so ​​rendert:

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

Auf diese Weise können die Daten an das übergeordnete Fenster gesendet und standortübergreifende Fälschungsprobleme umgangen werden.

13
Kelly