1. ホーム
  2. ruby-on-rails

[解決済み】コントローラでJSONをレンダリングする

2022-02-10 21:44:20

質問

ある本を読んでいて、コントローラについての章でレンダリングについて書かれているのですが、JSONについてはこのような例があるのですが、詳細には書かれていないので、この例がどのように当てはまるのか、全体像がわかりません。

render :json => @projects, :include => tasks

また、JSONPをコールバック関数で使用する例もあります。

render :json => @record, :callback => 'updateRecordDisplay'

どなたか、これらについて説明してください。

どのように解決するのですか?

通常は、次のように返します。 JSON のどちらかだからです。

A) アプリケーションの一部または全部を Single Page Application (SPA) として構築しており、クライアントサイドの JavaScript がページを完全に再読み込みせずに追加データを取り込むことができる必要がある場合。

または

B) あなたは第三者が消費するAPIを構築しており、データをシリアライズするためにJSONを使用することにしました。

<サブ あるいは、自分のドッグフードを食べて、次のようなことをしているかもしれません。 両方とも

どちらの場合も render :json => some_data は、提供されたデータをJSON化します。 そのため :callback 2番目の例のキーはもう少し説明が必要ですが(下記参照)、同じアイデアの別のバリエーションです(JavaScriptが簡単に扱える方法でデータを返します)。

なぜ :callback ?

JSONP(2番目の例)は 同一生成元ポリシー これは、すべてのブラウザに組み込まれているセキュリティの一部です。 もし、あなたのAPIが api.yoursite.com で、アプリケーションを services.yoursite.com あなたのJavaScriptは、(デフォルトでは) XMLHttpRequest (XHR - ajax) のリクエストは services から api . その制限をごっそり回避してきた方法(以前は クロスオリジンリソース共有仕様が決定された ) は、サーバーからJSONデータを送信することです。 JSONの代わりにJavaScriptであるかのように ). したがって、送り返すのではなく

{"name": "John", "age": 45}

を送信すると、代わりにサーバーが返送します。

valueOfCallbackHere({"name": "John", "age": 45})

このように、クライアントサイドのJSアプリケーションでは script タグが指し示す api.yoursite.com/your/endpoint?name=John を作成し valueOfCallbackHere という関数(これはクライアント側のJSで定義する必要があります)があります。 を、この別のオリジンからのデータで .)