Que voulez-vous savoir exactement ? ActiveRecord a des méthodes qui sérialisent les enregistrements en JSON. Par exemple, ouvrez votre console rails et entrez ModelName.all.to_json
et vous verrez une sortie JSON. render :json
appelle essentiellement to_json
et renvoie le résultat au navigateur avec les en-têtes corrects. Ceci est utile pour les appels AJAX en JavaScript où vous souhaitez renvoyer des objets JavaScript à utiliser. En outre, vous pouvez utiliser la fonction callback
pour spécifier le nom de la fonction de rappel que vous souhaitez appeler via JSONP.
Par exemple, disons que nous avons un 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 a été renvoyé sous forme d'objet JSON. L'option callback appelle simplement une fonction JavaScript du nom passé avec l'objet JSON comme premier et seul argument.
Pour donner un exemple de la callback
regardez ce qui suit :
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 de l'utilisation d'un tel rappel est généralement de contourner les protections du navigateur qui limitent le partage des ressources entre origines (CORS). JSONP n'est cependant plus très utilisé, car il existe d'autres techniques plus sûres et plus simples pour contourner CORS.