নিয়ামকটিতে JSON রেন্ডারিং


103

আমি একটি বই পড়ছিলাম এবং কন্ট্রোলারদের সম্পর্কে একটি অধ্যায়ে যখন এটি রেন্ডারিং স্টাফের কথা বলে, JSON এর জন্য এটির উদাহরণ রয়েছে তবে বিশদ বিবরণে যায় না তাই এই উদাহরণটি যে বড় আকারের উপযুক্ত এটি আমি বুঝতে পারি না:

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

এবং জেএসওএনপি-সহ এটি কলব্যাক ফাংশনগুলির সাথে ব্যবহার করে কিছু উদাহরণ রয়েছে:

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

কেউ এই ব্যাখ্যা করতে পারেন?

উত্তর:


127

আপনি সাধারণত JSON ফেরত যাবেন কারণ:

ক) আপনি আপনার একক পৃষ্ঠা অ্যাপ্লিকেশন (এসপিএ) হিসাবে সমস্ত অ্যাপ্লিকেশন অংশ / নির্মাণ করছেন এবং পৃষ্ঠাটি সম্পূর্ণরূপে পুনরায় লোড না করে অতিরিক্ত ক্লায়েন্টের জাভা স্ক্রিপ্টের প্রয়োজন আপনার ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট।

অথবা

খ) আপনি এমন একটি এপিআই তৈরি করছেন যা তৃতীয় পক্ষগুলি গ্রাস করবে এবং আপনি আপনার ডেটা সিরিয়াল করার জন্য জেএসএন ব্যবহার করার সিদ্ধান্ত নিয়েছেন।

অথবা, সম্ভবত, আপনি নিজের ডগফুড খাচ্ছেন এবং উভয়ই করছেন

উভয় ক্ষেত্রে render :json => some_dataJSON-ify সরবরাহিত ডেটা করবে y :callbackদ্বিতীয় উদাহরণে কী একটি বিট আরো ব্যাখ্যা (নিচে দেখুন) প্রয়োজন, কিন্তু এটি একই ধারণা আরেকটি প্রকরণ আছে (একটি উপায় যে জাভাস্ক্রিপ্ট সহজে সব ব্যবস্থা করতে সক্ষম ডাটা ফিরে।)

কেন :callback?

জেএসএনপি (দ্বিতীয় উদাহরণ) একই উত্স নীতিটি ঘুরে দেখার এক উপায় যা প্রতিটি ব্রাউজারের অন্তর্নির্মিত সুরক্ষার অংশ of আপনি আপনার এপিআই থাকে api.yoursite.comএবং আপনি বন্ধ আপনার আবেদন ভজনা করা হবে না services.yoursite.comআপনার জাভাস্ক্রিপ্ট হবে না (ডিফল্ট অনুসারে) করতে সক্ষম হতে XMLHttpRequest(XHR - ওরফে Ajax) থেকে অনুরোধ servicesকরতে api। লোকেরা যেভাবে এই সীমাবদ্ধতার দিকে নজর রাখছে ( ক্রস-অরিজিন রিসোর্স শেয়ারিংয়ের অনুমানটি চূড়ান্ত হওয়ার আগে ) তা হল সার্ভার থেকে জেএসএন ডেটা প্রেরণ করে যেন এটি জেএসএন এর পরিবর্তে জাভাস্ক্রিপ্ট ছিল । সুতরাং, ফিরে পাঠানোর চেয়ে:

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

সার্ভার পরিবর্তে ফিরে পাঠাতে হবে:

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

সুতরাং, ক্লায়েন্ট-সাইড জেএস অ্যাপ্লিকেশনটি একটি scriptট্যাগ তৈরি করতে পারে যা নির্দেশ করে api.yoursite.com/your/endpoint?name=Johnএবং এই valueOfCallbackHereফাংশনটি (যা ক্লায়েন্ট-সাইড জেএসে সংজ্ঞায়িত করতে হবে) এই অন্যান্য উত্সের ডেটা সহ কল ​​করে )


এবং এই কৌশলগুলি মোটেও ব্যবহার না করা এবং এর পরিবর্তে জেএসএন-জবিল্ডার এবং ইজিার লোডিং ব্যবহার না করা ভাল? অথবা আমি বিভ্রান্ত হয়ে পড়েছি এবং সেগুলি দুটি ভিন্ন জিনিস?

1
@ ইউজার 1899082 - এই কৌশলগুলি আসলে আপনি যখন জবিল্ডার ব্যবহার করবেন তখন আপনি যে বিষয়ে উদ্বিগ্ন হবেন সে তুলনায় নিম্ন স্তরের ধারণাগুলি রয়েছে - উদাহরণস্বরূপ - আপনি আপনার to_jsonপদ্ধতির অভ্যন্তরে আপনার জিনিসগুলি সিরিয়ালাইজ করার জন্য জবিল্ডার ব্যবহার করতে পারেন না এমন কোনও কারণ নেই - মিশ্রণ এবং দুটির সাথে ম্যাচ render :json => some_object_that_uses_JBuilder_to_render_its_jsonকরা লাইসেন্স (যতদূর আমি বলতে পারি) লাইসেন্স।
শান ভিইরা

ধন্যবাদ শান, আপনার ব্যাখ্যাটি জসনকে কলব্যাকের সাথে রেন্ডারিং সম্পর্কে জানতে সহায়তা করেছে, এটি আমার সমস্যার সমাধান করেছে।
অভি

67

আপনি ঠিক কি জানতে চান? অ্যাক্টিভেকর্ডের এমন পদ্ধতি রয়েছে যা জেএসএনে রেকর্ডকে সিরিয়ালাইজ করে। উদাহরণস্বরূপ, আপনার রেল কনসোলটি খুলুন এবং প্রবেশ করুন ModelName.all.to_jsonএবং আপনি JSON আউটপুট দেখতে পাবেন। render :jsonমূলত to_jsonসঠিক হেডার সহ ব্রাউজারে কল করে এবং ফলাফলটি দেয় returns এটি জাভাস্ক্রিপ্টে 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
    }        
});

আপনি দেখতে পাচ্ছেন, আমরা আমাদের রেল অ্যাপ্লিকেশন থেকে আইডি 5 সহ ব্যবহারকারীকে পেতে এবং এটি আমাদের জাভাস্ক্রিপ্ট কোডে ব্যবহার করতে সক্ষম হয়েছি কারণ এটি একটি জেএসএন অবজেক্ট হিসাবে ফিরে এসেছে। কলব্যাক বিকল্পটি প্রথম এবং একমাত্র যুক্তি হিসাবে 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

আপনি উল্লেখ করছেন যে আপনি জেএসএন @projectsহিসাবে রেন্ডার করতে চান , এবং tasksরফতানি হওয়া ডেটাতে প্রকল্পের মডেলটিতে সংযুক্তি অন্তর্ভুক্ত করেন ।

উদাহরণস্বরূপ

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

আপনি উল্লেখ করছেন যে আপনি জেএসএন @projectsহিসাবে রেন্ডার করতে চান , এবং সেই ডেটা একটি জাভাস্ক্রিপ্ট কলটিতে মোড়ক করুন যা কিছুটা রেন্ডার করবে:

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

এটি ডেটা প্যারেন্ট উইন্ডোতে প্রেরণ এবং ক্রস-সাইট জালিয়াতির সমস্যাগুলি বাইপাস করার অনুমতি দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.