¿Que quieres saber exactamente? ActiveRecord tiene métodos que serializan registros en JSON. Por ejemplo, abra su consola de rieles e ingrese ModelName.all.to_json
y verá la salida JSON. render :json
esencialmente llama to_json
y devuelve el resultado al navegador con los encabezados correctos. Esto es útil para las llamadas AJAX en JavaScript en las que desea devolver objetos JavaScript para usar. Además, puede utilizar la callback
opción para especificar el nombre de la devolución de llamada que le gustaría llamar a través de JSONP.
Por ejemplo, digamos que tenemos un User
modelo que se ve así:{name: 'Max', email:' m@m.com'}
También tenemos un controlador que se ve así:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
Ahora, si hacemos una llamada AJAX usando jQuery así:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
Como puede ver, logramos obtener el usuario con id 5 de nuestra aplicación rails y usarlo en nuestro código JavaScript porque se devolvió como un objeto JSON. La opción de devolución de llamada simplemente llama a una función de JavaScript del nombre pasado con el objeto JSON como primer y único argumento.
Para dar un ejemplo de la callback
opción, eche un vistazo a lo siguiente:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
Ahora podemos crear una solicitud JSONP de la siguiente manera:
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 motivación para usar una devolución de llamada de este tipo suele ser eludir las protecciones del navegador que limitan el intercambio de recursos de origen cruzado (CORS). JSONP ya no se usa mucho, sin embargo, porque existen otras técnicas para eludir CORS que son más seguras y fáciles.