Rendu JSON dans le contrôleur

Je lisais un livre et dans un chapitre sur les contrôleurs quand il parlait de rendu, pour JSON, il a un exemple comme celui-ci mais n’entre pas dans les détails, donc je ne pouvais pas comprendre

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

Et aussi quelques exemples d’utilisation de JSONP avec les fonctions de rappel:

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

Est-ce que quelqu’un peut les expliquer?

Vous retournerez normalement JSON soit parce que:

A) Vous créez une partie ou la totalité de votre application en tant qu’application de page unique et vous avez besoin de votre code JavaScript côté client pour pouvoir extraire des données supplémentaires sans recharger complètement la page.

ou

B) Vous créez une API que des tiers consumront et vous avez décidé d’utiliser JSON pour sérialiser vos données.

Ou, éventuellement, vous mangez votre propre nourriture pour chien et faites les deux

Dans les deux cas, render :json => some_data JSON-ify les données fournies. La touche :callback dans le deuxième exemple nécessite un peu plus d’explications (voir ci-dessous), mais il s’agit d’une autre variante de la même idée (retour des données d’une manière facilement gérable par JavaScript).

Pourquoi :callback ?

JSONP (le deuxième exemple) est un moyen de contourner la politique de même origine qui fait partie de la sécurité intégrée de chaque navigateur. Si vous avez votre API sur api.yoursite.com et que vous api.yoursite.com votre application à partir de services.yoursite.com votre JavaScript ne sera pas (par défaut) capable de faire des requêtes XMLHttpRequest (XHR – aka ajax) à partir de services vers api . La façon dont les gens ont contourné cette limitation (avant la finalisation de la spécification de partage des ressources entre pays d’origine ) est d’envoyer les données JSON depuis le serveur comme s’il s’agissait de JavaScript au lieu de JSON . Ainsi, plutôt que de renvoyer:

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

le serveur renverrait plutôt:

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

Ainsi, une application JS côté client pourrait créer une balise de script pointant vers api.yoursite.com/your/endpoint?name=John et la fonction valueOfCallbackHere (qui devrait être définie dans le JS côté client) appelée avec le données de cette autre origine .)

Qu’est ce que tu veux savoir exactement? ActiveRecord a des méthodes qui sérialisent les enregistrements dans JSON. Par exemple, ouvrez votre console de rails et entrez ModelName.all.to_json et vous verrez la sortie JSON. render :json appelle essentiellement to_json et renvoie le résultat au navigateur avec les en-têtes appropriés. Ceci est utile pour les appels AJAX en JavaScript où vous souhaitez renvoyer des objects JavaScript à utiliser. En outre, vous pouvez utiliser l’option de callback pour spécifier le nom du rappel que vous souhaitez appeler via JSONP.

Par exemple, supposons que nous avons un modèle User qui ressemble à ceci: {name: 'Max', email:' m@m.com'}

Nous avons également un contrôleur qui ressemble à ceci:

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

Maintenant, si nous faisons un appel AJAX en utilisant jQuery comme ceci:

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

Comme vous pouvez le voir, nous avons réussi à obtenir l'utilisateur avec l'id 5 de notre application rails et à l'utiliser dans notre code JavaScript car il était retourné sous la forme d'un object JSON. L'option de rappel appelle simplement une fonction JavaScript du nom passé avec l'object JSON comme premier et seul argument.

Pour donner un exemple de l'option de callback , consultez les éléments suivants:

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

Maintenant, nous pouvons créer une requête JSONP comme suit:

 function testFunction(data) { alert(data.name); // Will alert Max }; var script = document.createElement("script"); script.src = "/users/5"; document.getElementsByTagName("head")[0].appendChild(script); 

La motivation pour utiliser un tel rappel est généralement de contourner les protections du navigateur qui limitent le partage de ressources entre origines (CORS). JSONP n'est cependant plus utilisé car d'autres techniques existent pour contourner CORS, plus sûres et plus faciles.

Pour l’instance de

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

Vous @projects que vous souhaitez rendre les @projects tant que JSON et inclure les tasks association sur le modèle de projet dans les données exscopes.

Pour l’instance de

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

Vous @projects que vous voulez rendre @projects tant que JSON et envelopper ces données dans un appel javascript qui sera rendu un peu comme:

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

Cela permet d’envoyer les données à la fenêtre parente et de contourner les problèmes de falsification intersites.