রেলগুলিতে, আপনি কীভাবে জেসনকে একটি ভিউ ব্যবহার করে উপস্থাপন করবেন?


125

মনে করুন আপনি আপনার ব্যবহারকারীগণের নিয়ন্ত্রণে রয়েছেন এবং আপনি কোনও শো অনুরোধের জন্য একটি জসন প্রতিক্রিয়া পেতে চান, আপনি যদি আপনার ভিউ / ব্যবহারকারী / দির, শো.জসন নামক এবং আপনার ব্যবহারকারীদের # শোয়ের পরে একটি ফাইল তৈরি করতে পারতেন তবে ভাল লাগবে ক্রিয়া সম্পন্ন হয়, এটি ফাইলটি রেন্ডার করে।

বর্তমানে আপনাকে এই লাইনের সাথে কিছু করতে হবে:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

তবে এটি দুর্দান্ত হবে যদি আপনি কেবল একটি show.json ফাইল তৈরি করতে পারতেন যা স্বয়ংক্রিয়ভাবে এমনভাবে রেন্ডার হয়ে যায়:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

এটি আমার প্রচুর দুঃখকে বাঁচাতে পারে এবং আমি যখন নিয়ামককে আমার জেএসন সরবরাহ করি তখন আমার যে ভয়াবহ নোংরা অনুভূতি হয় তা দূর হয়ে যায়


এই পোস্টটি এখনই দেখছেন, দেখে মনে হচ্ছে এটি আমাকে বেশি কিছু বাঁচাতে পারে না, তবে আমার আরও জটিল মামলা রয়েছে, যখন বিশ্বাস করি তখনই আমার মাথাব্যথার কারণ হয়
ম্যাথিউ

1
রেল 3 এ, আপনি কেবল format.jsonএকটি show.json.erbফাইল দিয়ে কল করতে পারেন । আমার উত্তর দেখুন।
জেমস লিম

উত্তর:


64

আপনার respond_toব্লকে আপনার এমন কিছু করতে সক্ষম হওয়া উচিত :

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

যা টেম্পলেটটি রেন্ডার করবে app/views/users/_show.json.erb


5
এটি ভাল, তবে আপনি দ্রুত খুঁজে পেয়ে যাবেন যে জাসন উত্পন্ন করার জন্য একটি বেদনাদায়ক উপায়। কিছু বিকল্পের জন্য আমার উত্তর দেখুন।
tybro0103

1
আংশিক ব্যবহার না করে এটি করার কোনও উপায় আছে কি?
উইলিয়াম জড

55

একটি ভিউ যুক্ত করার চেষ্টা করুন users/show.json.erbযখন আপনি জেএসএন ফর্ম্যাটটির জন্য একটি অনুরোধ করবেন তখন এটি রেন্ডার করা উচিত এবং আপনি এর দ্বারা যুক্ত হওয়া সুবিধাটিও পেয়ে যাবেন যার ফলে আপনার ফাইলটি এরকম কিছু দেখতে পাবে

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

9
এর @user.first_name.to_jsonপরিবর্তে আপনি ব্যবহার করতে পারেন escape_javascript। সেখানে কি জাতীয় দেয় এবং কি মধ্যে কিছু সূক্ষ্ম পার্থক্য আছে কঠোরভাবে তাদেরকে JSON। (এবং ব্রাউজারগুলি তাদের নিজস্ব জেএসএন পার্সার প্রয়োগ করার কারণে এই পার্থক্যগুলি গুরুত্বপূর্ণ হয়ে উঠছে))
জেমস এ রোজেন

1
আপনার সম্ভবত একক উদ্ধৃতিগুলি ডাবল কোটে পরিবর্তন করা উচিত, কারণ জেএসএন (জেএস এর বিপরীতে) কেবলমাত্র ডাবল-কোটযুক্ত স্ট্রিং গ্রহণ করে।
আবে ভোলেকার

1
এটি ভাল, তবে আপনি দ্রুত খুঁজে পেয়ে যাবেন যে জাসন উত্পন্ন করার জন্য একটি বেদনাদায়ক উপায়। কিছু বিকল্পের জন্য আমার উত্তর দেখুন।
tybro0103

আমি জানি এটি একটি পুরানো উত্তর, তবে এটি সম্পূর্ণ ভুল। to_json ইতিমধ্যে একটি ফর্ম্যাটেড জসন স্ট্রিং "" ফিরিয়ে দেবে, ফলে ফলস্বরূপ জেসন অতিরিক্ত উদ্ধৃতি ("" মান "") সহ কখনই বৈধ হবে না। এছাড়াও, যদি ব্যবহারকারীর প্রথম নামটি শূন্য হয়, ফলস্বরূপ জেসসনের মান হিসাবে "নাল" স্ট্রিংটি থাকবে। এছাড়াও <% = এইচটিএমএল পলায়ন ব্যবহার করে যা ইনপুট ডেটাতে এইচটিএমএল অক্ষরগুলিকে মঙ্গাল করবে।
d4n3

আমি মনে করি আপনার চারপাশে উদ্ধৃতিগুলি সরিয়ে ফেলতে হবে <%= xyz.to_json %>অন্যথায় আপনার অতিরিক্ত উদ্ধৃতি বাকী রয়েছে।
akostadinov

32

অন্যরা যেমন উল্লেখ করেছে যে আপনার ব্যবহারকারীর / শো.জসন ভিউ প্রয়োজন, তবে টেম্প্লেটিং ভাষাটির জন্য বিবেচনা করার বিকল্প রয়েছে ...

ERB

বাক্সের বাইরে কাজ করে। এইচটিএমএল-এর জন্য দুর্দান্ত, তবে আপনি এটি দ্রুত JSON এর জন্য ভয়ঙ্কর দেখতে পাবেন।

RABL

ভাল সমাধান। নির্ভরতা যুক্ত করতে হবে এবং এর ডিএসএল শিখতে হবে।

জেএসএন বিল্ডার

র‌্যাবএল হিসাবে একই চুক্তি: ভাল সমাধান। নির্ভরতা যুক্ত করতে হবে এবং এর ডিএসএল শিখতে হবে।

সরল রুবি

রুবি জেএসওএন তৈরিতে দুর্দান্ত এবং আপনি to_jsonহ্যাশ বা কোনও এআর অবজেক্টে কল করতে পারেন বলে শিখার মতো নতুন কিছু নেই । কেবলমাত্র টেমপ্লেটগুলির জন্য .rb এক্সটেনশনটি নিবন্ধ করুন (একটি প্রাথমিককরণে):

ActionView::Template.register_template_handler(:rb, :source.to_proc)

তারপরে দৃশ্য ব্যবহারকারী / show.json.rb তৈরি করুন:

@user.to_json

এই পদ্ধতির আরও তথ্যের জন্য দেখুন http://railscasts.com/episodes/379-template-handlers


7
নোট করুন 4 রেলগুলিতে .ruby টেমপ্লেট হ্যান্ডলারটি ডিফল্ট github.com/rails/rails/commit/de1060f4e02925c12004f2 দ্বারা নিবন্ধিত হয় যাতে আপনি .rb নিবন্ধন করতে পারেন এবং আপনার ফাইল ব্যবহারকারী / show.json.ruby নাম রাখতে পারেন।
টিম ডিজিগিনস

1
এছাড়াও, আপডেট করতে এই আরও, json_builder দ্বারা সংযোজন করা হয়েছে github.com/rails/jbuilder
টিম ডিজিগিনস

27

আপনি যদি ইআরবি সিনট্যাক্সের জন্য কোনও ক্লিনার বিকল্প খুঁজছেন তবে আমি সম্ভবত এটির সর্বোত্তম সমাধান হ'ল র‌্যাবএল। json_builder এবং argonaut, যা অন্যান্য সমাধান, উভয়ই কিছুটা পুরানো বলে মনে হয় এবং কোনও প্যাচিং ছাড়াই ails.১ রেলগুলির সাথে কাজ করবে না।

র‌্যাবএল একটি রত্নের মাধ্যমে পাওয়া যায় বা গিটহাব সংগ্রহস্থলটি পরীক্ষা করে দেখুন; ভাল উদাহরণ

https://github.com/nesquena/rabl


21

এই পৃষ্ঠায় শেষ হওয়া অন্যদের জন্য কেবল এই উত্তরটি আপডেট করার জন্য।

3 রেলগুলিতে আপনাকে কেবল একটি ফাইল তৈরি করতে হবে views/users/show.json.erb@userবস্তুর দৃশ্যে উপলব্ধ করা হবে (ঠিক মত HTML- এর জন্য হতে হবে।) এমনকি আপনি প্রয়োজন হবে নাto_json আর।

সংক্ষেপে বলতে গেলে, এটি ঠিক

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

এবং

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

1
আমি এর উত্তর 1.5 বছর আগে। আজকাল আমি যখনই জেএসওএন যেমন প্রয়োজন তখনই রেসপন্স_সহ ব্যবহার করি respond_with @user, only: [:name]। আরও তথ্যের জন্য এই টিউটোরিয়াল দেখুন।
জেমস লিম

1
কেবলমাত্র এই উত্তরে যুক্ত করার জন্য, এটি দুটি কারণের জন্য আসলে বিপজ্জনক: এটি ব্যবহারকারীর ডেটা থেকে ইনজেকশনের অনুমতি দেয় কারণ এটি নিউলাইন এবং ব্যাকস্ল্যাশগুলি এড়ায় না এবং <% = এইচটিএমএল ডেটাও এড়িয়ে যায় সুতরাং উদাহরণস্বরূপ শন ও'কনর তার নাম রাখবে শন ও ও অ্যাপোস; কনরকে মঙ্গল করা হয়েছে।
d4n3

10

কেবল show.json.erbবিষয়বস্তু সহ ফাইল যুক্ত করুন

<%= @user.to_json %>

কখনও কখনও এটি কার্যকর হয় যখন আপনার কিছু অতিরিক্ত সহায়ক পদ্ধতি প্রয়োজন যা নিয়ামক হিসাবে উপলব্ধ নয়, image_path(@user.avatar)বা জেএসএনে অতিরিক্ত সম্পত্তি উত্পন্ন করার জন্য কিছু:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>

8
এটি <%= raw(@user.to_json) %>এইচটিএমএল পলায়ন এড়ানো প্রয়োজন হবে । আমি যা করি তা হ'ল আমি_জসনের উপর নির্ভর করি যতক্ষণ না এটি আমাকে যা চায় তা দেয় তবে আমি যখন অন্য কিছু করতে চাই তখন আমি সাধারণত এটির সাথে টেম্পলেট করি { :blah => @user.the_blah }.to_json
ক্লেক


0

আমি আরআর-এ নতুন এটি আমি খুঁজে পেয়েছি। আপনি সরাসরি একটি জসন ফর্ম্যাট রেন্ডার করতে পারেন

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.