Zwykle będziesz zwracać JSON , ponieważ:
A) Budujesz część / całą aplikację jako aplikację jednostronicową (SPA) i potrzebujesz JavaScript po stronie klienta, aby móc pobierać dodatkowe dane bez pełnego ponownego ładowania strony.
lub
B) Budujesz interfejs API, z którego będą korzystać osoby trzecie, i zdecydowałeś się użyć JSON do serializacji danych.
Lub, być może, jesz własną dogfood i robisz jedno i drugie
W obu przypadkach render :json => some_data
będzie JSON-ify podane dane. :callback
Klucz w drugim przykładzie potrzebuje nieco więcej wyjaśnienia (patrz poniżej), ale to jest inna wariacja na ten sam pomysł (powrót dane w taki sposób, że można łatwo obsługiwać JavaScript.)
Dlaczego :callback
?
JSONP (drugi przykład) to sposób na obejście tej samej zasady pochodzenia, która jest częścią wbudowanych zabezpieczeń każdej przeglądarki. Jeśli masz interfejs API pod adresem api.yoursite.com
i będziesz obsługiwać aplikację poza services.yoursite.com
JavaScript, nie będzie (domyślnie) mógł wykonywać XMLHttpRequest
żądań (XHR - aka ajax) od services
do api
. Sposób, w jaki ludzie przekradali się przez to ograniczenie (przed sfinalizowaniem specyfikacji współdzielenia zasobów między źródłami ), polega na wysyłaniu danych JSON z serwera, tak jakby był to JavaScript zamiast JSON ). Dlatego zamiast odesłać:
{"name": "John", "age": 45}
serwer zamiast tego odeśle:
valueOfCallbackHere({"name": "John", "age": 45})
W ten sposób aplikacja JS po stronie klienta mogłaby utworzyć script
znacznik wskazujący na api.yoursite.com/your/endpoint?name=John
i mieć valueOfCallbackHere
funkcję (która musiałaby być zdefiniowana w JS po stronie klienta) wywoływaną z danymi z tego innego źródła ).
to_json
metodach - mieszanie i dopasowanie tych dwóchrender :json => some_object_that_uses_JBuilder_to_render_its_json
jest (o ile wiem) legalne.Co dokładnie chcesz wiedzieć? ActiveRecord zawiera metody serializacji rekordów do formatu JSON. Na przykład, otwórz konsolę railsów i wejdź,
ModelName.all.to_json
a zobaczysz wyjście JSON.render :json
zasadniczo wywołujeto_json
i zwraca wynik do przeglądarki z poprawnymi nagłówkami. Jest to przydatne w przypadku wywołań AJAX w JavaScript, w których chcesz zwrócić obiekty JavaScript do użycia. Dodatkowo możesz użyćcallback
opcji, aby określić nazwę wywołania zwrotnego, które chcesz wywołać przez JSONP.Na przykład, powiedzmy, że mamy
User
model, który wygląda następująco:{name: 'Max', email:' [email protected]'}
Mamy też kontroler, który wygląda tak:
Teraz, jeśli wykonamy wywołanie AJAX za pomocą jQuery w następujący sposób:
Jak widać, udało nam się pobrać użytkownika o identyfikatorze 5 z naszej aplikacji railsowej i użyć go w naszym kodzie JavaScript, ponieważ został zwrócony jako obiekt JSON. Opcja wywołania zwrotnego po prostu wywołuje funkcję JavaScript o nazwie przekazanej z obiektem JSON jako pierwszym i jedynym argumentem.
Aby podać przykład
callback
opcji, spójrz na następujące kwestie:Teraz możemy utworzyć żądanie JSONP w następujący sposób:
Motywacją do korzystania z takiego wywołania zwrotnego jest zwykle obejście zabezpieczeń przeglądarki, które ograniczają udostępnianie zasobów między źródłami (CORS). Jednak JSONP nie jest już tak często używany, ponieważ istnieją inne techniki obchodzenia CORS, które są bezpieczniejsze i łatwiejsze.
źródło
callback:
opcji wrender
metodzie, a następnie pokazanie jej wAjax
wywołaniu.Na przykład
Oświadczasz, że chcesz renderować
@projects
jako JSON i uwzględnić skojarzenietasks
w modelu projektu w wyeksportowanych danych.Na przykład
Twierdzisz, że chcesz renderować
@projects
jako JSON i opakować te dane w wywołanie javascript, które będzie renderować się mniej więcej tak:Umożliwia to wysyłanie danych do okna nadrzędnego i ominięcie problemów z fałszerstwami między lokacjami.
źródło