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?
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).
: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 .)
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.
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.