Що саме ви хочете знати? ActiveRecord має методи, які серіалізують записи в JSON. Наприклад, відкрийте консоль рейки та введіть, 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
}
});
Як бачите, нам вдалося отримати Користувача з id 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 вже не використовується так багато, оскільки існують інші методи обходу, які є безпечнішими та простішими.