नियंत्रक में JSON का प्रतिपादन


103

मैं एक पुस्तक पढ़ रहा था और नियंत्रक के बारे में एक अध्याय में जब यह सामान प्रदान करने के बारे में बात करता है, तो JSON के लिए इसका एक उदाहरण है, लेकिन विवरण में नहीं जाता है इसलिए मैं बड़ी तस्वीर का पता नहीं लगा सका कि यह उदाहरण इसमें फिट बैठता है:

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

और JSONP के साथ कॉलबैक फ़ंक्शन के साथ इसका उपयोग करने के लिए कुछ उदाहरण भी:

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

क्या कोई इन्हें समझा सकता है?

जवाबों:


127

आप सामान्य रूप से JSON लौटा देंगे क्योंकि:

ए) आप सिंगल पेज एप्लीकेशन (एसपीए) के रूप में अपने सभी एप्लिकेशन का हिस्सा / निर्माण कर रहे हैं और आपको पेज को पूरी तरह से लोड किए बिना अतिरिक्त डेटा में खींचने में सक्षम होने के लिए अपने क्लाइंट-साइड जावास्क्रिप्ट की आवश्यकता है।

या

बी) आप एक एपीआई का निर्माण कर रहे हैं जो तीसरे पक्ष की खपत होगी और आपने अपने डेटा को क्रमबद्ध करने के लिए JSON का उपयोग करने का निर्णय लिया है।

या, संभवतः, आप अपने खुद के डॉगफूड खा रहे हैं और दोनों कर रहे हैं

दोनों मामलों render :json => some_dataमें JSON-ify प्रदान किया गया डेटा। :callbackदूसरे उदाहरण में कुंजी में थोड़ा और अधिक समझा (देखें नीचे) की जरूरत है, लेकिन यह एक ही विचार पर एक और भिन्नता है (एक तरीका है कि जावास्क्रिप्ट आसानी से संभाल कर सकते हैं में डेटा लौटने।)

क्यों :callback?

JSONP (दूसरा उदाहरण) समान उत्पत्ति नीति के आसपास होने का एक तरीका है जो हर ब्राउज़र की अंतर्निहित सुरक्षा का हिस्सा है। आप कम से अपने एपीआई है, तो api.yoursite.comऔर आप से दूर अपने आवेदन की सेवा की जाएगी services.yoursite.comआपकी जावास्क्रिप्ट नहीं होगा (डिफ़ॉल्ट रूप से) करने में सक्षम हो XMLHttpRequest(एक्सएचआर - उर्फ ajax) से अनुरोध servicesकरने के लिए api। जिस तरह से लोग उस सीमा के चारों ओर छलनी कर रहे हैं ( क्रॉस-ऑरिजनल रिसोर्स शेयरिंग कल्पना से पहले अंतिम रूप दिया गया था ) सर्वर से JSON डेटा भेजकर है जैसे कि यह JSON के बजाय जावास्क्रिप्ट था )। इस प्रकार, वापस भेजने के बजाय:

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

इसके बजाय सर्वर वापस भेज देगा:

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

इस प्रकार, एक क्लाइंट-साइड जेएस एप्लिकेशन इस scriptओर इशारा करते हुए एक टैग बना सकता api.yoursite.com/your/endpoint?name=Johnहै और valueOfCallbackHereफ़ंक्शन (जिसे क्लाइंट-साइड जेएस में परिभाषित करना होगा) को इस अन्य मूल के डेटा के साथ बुलाया गया है ।)


और क्या यह बेहतर है कि इन तकनीकों का उपयोग न करें और इसके बजाय JSON-JBuilder और Eager Loading का उपयोग करें? या मैं भ्रमित हूं और वे दो अलग-अलग चीजें हैं।

1
@ user1899082 - ये तकनीक वास्तव में निम्न स्तर की अवधारणाएं हैं जो आप के बारे में चिंता करेंगे जब आप JBuilder का उपयोग करते हैं, उदाहरण के लिए - कोई कारण नहीं है कि आप अपने to_jsonतरीकों के अंदर अपनी वस्तुओं को आसान बनाने के लिए JBuilder का उपयोग नहीं कर सकते हैं - मिश्रण और दोनों render :json => some_object_that_uses_JBuilder_to_render_its_jsonका मिलान (जहाँ तक मैं बता सकता हूँ) लाइसेंस है।
सीन विएरा

धन्यवाद शॉन, आपके स्पष्टीकरण ने मुझे कॉलबैक के साथ जसन के बारे में जानने में मदद की, इससे मेरी एक समस्या हल हो गई।
अभय

67

आप ठीक - ठीक क्या जानना चाहते हैं? ActiveRecord में JSON में रिकॉर्ड करने वाले तरीके हैं। उदाहरण के लिए, अपने रेल कंसोल को खोलें और दर्ज करें ModelName.all.to_jsonऔर आपको JSON आउटपुट दिखाई देगा। render :jsonअनिवार्य रूप to_jsonसे सही हेडर के साथ ब्राउज़र को परिणाम कॉल और वापस करता है। यह जावास्क्रिप्ट में AJAX कॉल के लिए उपयोगी है जहाँ आप उपयोग करने के लिए जावास्क्रिप्ट ऑब्जेक्ट वापस करना चाहते हैं। इसके अतिरिक्त, आप callbackउस कॉलबैक का नाम निर्दिष्ट करने के लिए विकल्प का उपयोग कर सकते हैं जिसे आप JSONP के माध्यम से कॉल करना चाहते हैं।

उदाहरण के लिए, हम कहते हैं कि हमारे पास एक 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
    }        
});

जैसा कि आप देख सकते हैं, हमने अपने रेल एप्लिकेशन से आईडी 5 के साथ उपयोगकर्ता प्राप्त करने और इसे हमारे जावास्क्रिप्ट कोड में उपयोग करने में कामयाब रहे क्योंकि इसे JSON ऑब्जेक्ट के रूप में वापस किया गया था। कॉलबैक विकल्प सिर्फ JSON ऑब्जेक्ट के साथ पारित नाम के एक जावास्क्रिप्ट फ़ंक्शन को पहले और एकमात्र तर्क के रूप में कहता है।

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);

इस तरह के कॉलबैक का उपयोग करने की प्रेरणा आम तौर पर ब्राउज़र सुरक्षा को दरकिनार करने के लिए होती है जो क्रॉस मूल संसाधन साझाकरण (कोर) को सीमित करती है। JSONP का उपयोग अब और नहीं किया जाता है, हालांकि, क्योंकि अन्य तकनीक मौजूद CORS को सुरक्षित और आसान बनाने के लिए मौजूद हैं।


क्या आप अपने उदाहरण को थोड़ा बढ़ा सकते हैं? विधि callback:में एक विकल्प जोड़ना render, और फिर Ajaxकॉल के अंदर दिखाना ।
अरूप रक्षित

15

के उदाहरण के लिए

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

आप बता रहे हैं कि आप @projectsJSON के रूप में रेंडर करना चाहते हैं , और tasksनिर्यात किए गए डेटा में प्रोजेक्ट मॉडल पर एसोसिएशन को शामिल करें ।

के उदाहरण के लिए

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

आप बता रहे हैं कि आप @projectsJSON के रूप में प्रस्तुत करना चाहते हैं , और उस डेटा को एक जावास्क्रिप्ट कॉल में लपेटें जो कुछ हद तक प्रस्तुत करेगा:

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

यह डेटा को मूल विंडो पर भेजने और क्रॉस-साइट जालसाजी के मुद्दों को बायपास करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.