Обычно вы возвращаете JSON по одной из следующих причин :
A) Вы создаете часть / все свое приложение как одностраничное приложение (SPA), и вам нужен клиентский JavaScript, чтобы иметь возможность извлекать дополнительные данные без полной перезагрузки страницы.
или
Б) Вы создаете API, который будут использовать третьи стороны, и вы решили использовать JSON для сериализации ваших данных.
Или, возможно, вы едите собачий корм и делаете и то, и другое.
В обоих случаях render :json => some_data
предоставленные данные будут обработаны в формате JSON. :callback
Ключ во втором примере нужно немного больше объяснения (см ниже), но это еще одна вариация на ту же идею (возврат данных таким образом , что JavaScript может легко обрабатывать.)
Почему :callback
?
JSONP (второй пример) - это способ обойти политику одинакового происхождения, которая является частью встроенной безопасности каждого браузера. Если у вас есть API в api.yoursite.com
и вы будете обслуживать свое приложение с помощью services.yoursite.com
JavaScript, то (по умолчанию) не сможете выполнять XMLHttpRequest
(XHR - ajax) запросы из services
в api
. Люди обходят это ограничение (до того, как была завершена спецификация совместного использования ресурсов между источниками ), отправляя данные JSON с сервера, как если бы это был JavaScript, а не JSON ). Таким образом, вместо отправки обратно:
{"name": "John", "age": 45}
сервер вместо этого отправит обратно:
valueOfCallbackHere({"name": "John", "age": 45})
Таким образом, клиентское приложение JS может создать script
тег, указывающий на, api.yoursite.com/your/endpoint?name=John
и вызвать valueOfCallbackHere
функцию (которая должна быть определена в клиентском JS) с данными из этого другого источника .)
to_json
методов - смешивание и совпадение этих двухrender :json => some_object_that_uses_JBuilder_to_render_its_json
(насколько я могу судить) законно.Что именно ты хочешь знать? В ActiveRecord есть методы, которые сериализуют записи в JSON. Например, откройте консоль rails и введите,
ModelName.all.to_json
и вы увидите вывод JSON.render :json
по существу вызываетto_json
и возвращает результат браузеру с правильными заголовками. Это полезно для вызовов AJAX в JavaScript, когда вы хотите вернуть объекты JavaScript для использования. Кроме того, вы можете использовать этуcallback
опцию, чтобы указать имя обратного вызова, который вы хотите вызвать через JSONP.Например, допустим, у нас есть
User
модель, которая выглядит так:{name: 'Max', email:' m@m.com'}
Еще у нас есть контроллер, который выглядит так:
Теперь, если мы выполним вызов AJAX с помощью jQuery следующим образом:
Как видите, нам удалось получить пользователя с идентификатором 5 из нашего приложения rails и использовать его в нашем коде JavaScript, поскольку он был возвращен как объект JSON. Опция обратного вызова просто вызывает функцию JavaScript переданного имени с объектом JSON в качестве первого и единственного аргумента.
Чтобы дать пример
callback
варианта, взгляните на следующее:Теперь мы можем создать JSONP-запрос следующим образом:
Мотивация для использования такого обратного вызова обычно заключается в обходе средств защиты браузера, которые ограничивают совместное использование ресурсов между источниками (CORS). Однако JSONP больше не используется, потому что существуют другие методы обхода CORS, которые более безопасны и проще.
источник
callback:
параметра вrender
метод, а затем его отображение внутриAjax
вызова.Например,
Вы заявляете, что хотите отобразить
@projects
как JSON, и включить связьtasks
модели Project в экспортированные данные.Например,
Вы заявляете, что хотите отобразить
@projects
как JSON, и заключить эти данные в вызов javascript, который будет отображаться примерно так:Это позволяет отправлять данные в родительское окно и обходить проблемы межсайтовой подделки.
источник