Что именно ты хочешь знать? В ActiveRecord есть методы, которые сериализуют записи в JSON. Например, откройте консоль rails и введите, ModelName.all.to_json
и вы увидите вывод JSON. render :json
по существу вызывает to_json
и возвращает результат браузеру с правильными заголовками. Это полезно для вызовов AJAX в JavaScript, когда вы хотите вернуть объекты JavaScript для использования. Кроме того, вы можете использовать эту callback
опцию, чтобы указать имя обратного вызова, который вы хотите вызвать через JSONP.
Например, допустим, у нас есть User
модель, которая выглядит так:{name: 'Max', email:' m@m.com'}
Еще у нас есть контроллер, который выглядит так:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user
end
end
Теперь, если мы выполним вызов AJAX с помощью jQuery следующим образом:
$.ajax({
type: "GET",
url: "/users/5",
dataType: "json",
success: function(data){
alert(data.name) // Will alert Max
}
});
Как видите, нам удалось получить пользователя с идентификатором 5 из нашего приложения rails и использовать его в нашем коде JavaScript, поскольку он был возвращен как объект JSON. Опция обратного вызова просто вызывает функцию JavaScript переданного имени с объектом JSON в качестве первого и единственного аргумента.
Чтобы дать пример callback
варианта, взгляните на следующее:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
render json: @user, callback: "testFunction"
end
end
Теперь мы можем создать JSONP-запрос следующим образом:
function testFunction(data) {
alert(data.name); // Will alert Max
};
var script = document.createElement("script");
script.src = "/users/5";
document.getElementsByTagName("head")[0].appendChild(script);
Мотивация для использования такого обратного вызова обычно заключается в обходе средств защиты браузера, которые ограничивают совместное использование ресурсов между источниками (CORS). Однако JSONP больше не используется, потому что существуют другие методы обхода CORS, которые более безопасны и проще.