114

私は本を​​読んでいて、コントローラーについての章でレンダリングについて説明しています。JSONの場合、このような例がありますが、詳細には触れていないため、この例が当てはまる全体像を理解できませんでした。

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

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

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

誰かがこれらを説明できますか?

4

3 に答える 3

136

通常、次のいずれかの理由でJSONを返します。

A)アプリケーションの一部/すべてをシングルページアプリケーション(SPA)として構築しており、ページを完全にリロードせずに追加のデータを取得できるようにするには、クライアント側のJavaScriptが必要です。

また

B)サードパーティが使用するAPIを構築しており、JSONを使用してデータをシリアル化することにしました。

または、おそらく、あなたはあなた自身のドッグフーディングを食べていて、両方をやっています

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

なぜ:callbackですか?

JSONP(2番目の例)は、すべてのブラウザーの組み込みセキュリティの一部である同一生成元ポリシーを回避する方法です。にAPIがあり、JavaScriptapi.yoursite.comからアプリケーションを提供する場合、services.yoursite.com(デフォルトでは)からへのXMLHttpRequestリクエスト(XHR-別名ajax)を行うことはできません。(クロスオリジンリソースシェアリングの仕様が完成する前に)人々がその制限を回避してきた方法は、JSONデータをJSONではなくJavaScriptであるかのようにサーバーから送信することです)。したがって、返送するのではなく、servicesapi

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

代わりに、サーバーは以下を送り返します。

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

したがって、クライアント側のJSアプリケーションは、この他のオリジンからのデータで呼び出される関数(クライアント側のJSで定義する必要があります)をscript指すタグを作成し、api.yoursite.com/your/endpoint?name=John持つことができます。)valueOfCallbackHere

于 2013-02-12T02:53:48.923 に答える
74

正確に何を知りたいですか?ActiveRecordには、レコードをJSONにシリアル化するメソッドがあります。たとえば、Railsコンソールを開いて入力するModelName.all.to_jsonと、JSON出力が表示されます。基本的に、正しいヘッダーを使用して結果をrender :json呼び出してブラウザに返します。to_jsonこれは、使用するJavaScriptオブジェクトを返すJavaScriptでのAJAX呼び出しに役立ちます。さらに、このオプションを使用して、callbackJSONPを介して呼び出したいコールバックの名前を指定できます。

たとえば、User次のようなモデルがあるとします。{name: 'Max', email:' m@m.com'}

次のようなコントローラーもあります。

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user
    end
end

ここで、次のようにjQueryを使用してAJAX呼び出しを行う場合:

$.ajax({
    type: "GET",
    url: "/users/5",
    dataType: "json",
    success: function(data){
        alert(data.name) // Will alert Max
    }        
});

ご覧のとおり、RailsアプリからID 5のユーザーを取得し、JSONオブジェクトとして返されたため、JavaScriptコードで使用することができました。コールバックオプションは、JSONオブジェクトを最初で唯一の引数として渡されたnamedのJavaScript関数を呼び出すだけです。

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を回避するための他の手法が存在するため、あまり使用されていません。

于 2013-02-12T02:53:11.687 に答える
18

のインスタンスの場合

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

@projectsJSONとしてレンダリングtasksし、エクスポートされたデータにプロジェクトモデルの関連付けを含めることを指定しています。

のインスタンスの場合

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

JSONとしてレンダリング@projectsし、そのデータを次のようにレンダリングするjavascript呼び出しでラップすることを表明しています。

updateRecordDisplay({'projects' => []})

これにより、データを親ウィンドウに送信し、クロスサイト偽造の問題を回避できます。

于 2013-02-12T02:52:10.003 に答える