Denetleyicide JSON işleme


103

Bir kitap okuyordum ve bir şeyler render etme hakkında konuşurken Denetleyicilerle ilgili bir bölümde, JSON için bunun gibi bir örneği var ama ayrıntılara girmiyor, bu yüzden bu örneğin uygun olduğu daha büyük resmi bulamadım:

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

Ve ayrıca JSONP ile geri arama işlevleriyle kullanan bir örnek:

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

Biri bunları açıklayabilir mi?

Yanıtlar:


127

Normalde ya JSON döndürürsünüz çünkü:

Y) Uygulamanızın bir bölümünü / tamamını Tek Sayfa Uygulaması (SPA) olarak oluşturuyorsunuz ve sayfayı tamamen yeniden yüklemeden ek verileri alabilmek için istemci tarafı JavaScript'inize ihtiyacınız var.

veya

B) Üçüncü tarafların kullanacağı bir API oluşturuyorsunuz ve verilerinizi serileştirmek için JSON kullanmaya karar verdiniz.

Veya muhtemelen kendi test sürümünüzü yiyorsunuz ve her ikisini de yapıyorsunuz

Her iki durumda render :json => some_datada sağlanan verileri JSON-eşleştirir. :callbackİkinci örnekte anahtar biraz daha (aşağıya bakınız) açıklayan gerekir ama aynı fikri üzerine başka çeşididir (JavaScript kolayca işleyebilir bir şekilde veri döndürme.)

Neden :callback?

JSONP (ikinci örnek), her tarayıcının yerleşik güvenliğinin bir parçası olan Aynı Kaynak Politikasını aşmanın bir yoludur . Eğer adresinden API varsa api.yoursite.comve siz off başvurunuzu hizmet verecek services.yoursite.comJavaScript'inizde olmaz (varsayılan olarak) yapabilmek XMLHttpRequest(XHR - aka ajax) istekleri servicesiçin api. İnsanların bu sınırlamayı ( Cross-Origin Resource Sharing spesifikasyonu sonuçlandırılmadan önce) gizlice dolaşma şekli , JSON verilerini JSON yerine JavaScript gibi sunucudan göndermektir . Böylece, geri göndermek yerine:

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

bunun yerine sunucu geri gönderir:

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

Bu nedenle, bir istemci tarafı JS uygulaması, scriptişaret eden bir etiket oluşturabilir api.yoursite.com/your/endpoint?name=Johnve bu diğer kaynaktan gelen verilerlevalueOfCallbackHere çağrılan (istemci tarafı JS'de tanımlanması gereken) işleve sahip olabilir .)


ve bu teknikleri hiç kullanmamak ve onun yerine JSON-JBuilder ve Eager Loading kullanmak daha mı iyi? Ya da kafam karıştı ve bunlar iki farklı şey.

1
@ user1899082 - bu teknikler aslında JBuilder'ı kullandığınızda endişeleneceğinizden daha düşük seviyeli kavramlardır, örneğin - nesnelerinizi to_jsonyöntemleriniz içinde daha kolay serileştirmek için JBuilder'ı kullanamamanız için hiçbir neden yoktur - karıştırma ve ikisini eşleştirmek render :json => some_object_that_uses_JBuilder_to_render_its_json(söyleyebildiğim kadarıyla) yasal.
Sean Vieira 13

Teşekkürler Sean, açıklamanız geri arama ile json oluşturma hakkında bilgi edinmeme yardımcı oldu, bu benim sorunumdan birini çözdü.
Abhi

67

Tam olarak neyi bilmek istiyorsun? ActiveRecord, kayıtları JSON'a serileştiren yöntemlere sahiptir. Örneğin, raylar konsolunuzu açın ve girin ModelName.all.to_jsonve JSON çıktısını göreceksiniz. render :jsonesasen to_json, sonucu tarayıcıya doğru başlıklarla çağırır ve döndürür. Bu, JavaScript nesnelerini kullanmak üzere döndürmek istediğiniz JavaScript'teki AJAX çağrıları için kullanışlıdır. Ek olarak, callbackJSONP aracılığıyla çağırmak istediğiniz geri aramanın adını belirtme seçeneğini kullanabilirsiniz .

Örneğin, şöyle Usergörünen bir modelimiz olduğunu varsayalım:{name: 'Max', email:' m@m.com'}

Ayrıca şuna benzeyen bir denetleyicimiz var:

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

Şimdi, jQuery kullanarak şöyle bir AJAX çağrısı yaparsak:

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

Gördüğünüz gibi, id 5 olan Kullanıcıyı rails uygulamamızdan almayı ve JSON nesnesi olarak döndürüldüğü için JavaScript kodumuzda kullanmayı başardık. Geri çağırma seçeneği, yalnızca ilk ve tek bağımsız değişken olarak JSON nesnesiyle geçirilen adlandırılmış bir JavaScript işlevini çağırır.

Seçeneğe bir örnek vermek callbackiçin aşağıdakilere bir göz atın:

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

Şimdi bir JSONP talebini aşağıdaki gibi oluşturabiliriz:

function testFunction(data) {
    alert(data.name); // Will alert Max
};

var script = document.createElement("script");
script.src = "/users/5";

document.getElementsByTagName("head")[0].appendChild(script);

Böyle bir geri aramayı kullanmanın nedeni, tipik olarak, çapraz kaynak kaynak paylaşımını (CORS) sınırlayan tarayıcı korumalarını atlatmaktır. Bununla birlikte, JSONP artık çok fazla kullanılmıyor, çünkü CORS'yi aşmak için daha güvenli ve daha kolay başka teknikler var.


Örneğinizi biraz uzatabilir misiniz? Yönteme bir callback:seçenek eklemek renderve ardından Ajaxçağrının içinde göstermek .
Arup Rakshit

15

Örneği için

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

@projectsJSON olarak oluşturmak istediğinizi belirtiyorsunuz tasksve dışa aktarılan verilere Proje modelindeki ilişkilendirmeyi dahil ediyorsunuz .

Örneği için

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

@projectsJSON olarak oluşturmak istediğinizi belirtiyorsunuz ve bu verileri, aşağıdaki gibi oluşturacak bir javascript çağrısına sarıyorsunuz:

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

Bu, verilerin ana pencereye gönderilmesine ve siteler arası sahtecilik sorunlarını atlamasına olanak tanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.