ব্যান্ডগুলি: প্রতিক্রিয়া_তে ব্লক কীভাবে কাজ করে?


211

আমি রেল গাইডের সাথে শুরু করার মধ্য দিয়ে যাচ্ছি এবং 6..7 বিভাগে বিভ্রান্ত হয়েছি। একটি স্ক্যাফোল্ড তৈরির পরে আমি আমার নিয়ামকটিতে নিম্নলিখিত স্বয়ংক্রিয় উত্পন্ন ব্লকটি দেখতে পাচ্ছি:

def index
  @posts = Post.all

  respond_to do |format|
    format.html  # index.html.erb
    format.json  { render :json => @posts }
  end
end

আমি কীভাবে প্রতিক্রিয়া_তে ব্লকটি কার্যকরভাবে কাজ করে তা বুঝতে চাই। বিন্যাসটি কি ধরণের পরিবর্তনশীল? বিন্যাস অবজেক্টের .html এবং .json পদ্ধতি কি? ডকুমেন্টেশন জন্য

ActionController::MimeResponds::ClassMethods::respond_to

প্রশ্নের উত্তর দেয় না।


আমি যদি অ্যাকশনকন্ট্রোলার :: মাইম রিস্পন্ডস :: ক্লাসমেথডস :: রেসপন্স_কে কিন্তু এপি.রুবোনরাইলস.আরোগুলি সরাসরি হাইপারলিংকগুলি পছন্দ করে না বলে মনে হয় তবে খুব ভাল লাগবে ...
কোল

প্রতিক্রিয়ার_পরে কলটি শেষ হয় (উদাঃ blah.html, blah.json, ইত্যাদি) এবং নির্দিষ্ট করা ভিউয়ের সাথে মেলে। অ্যাপ্লিকেশনটির উপর নির্ভর করে অন্যান্য প্রতিক্রিয়াগুলি এক্সএমএল, সিএসভি এবং আরও অনেক কিছু হতে পারে।
স্কটজেশিয়া

5
এটি কীভাবে "নির্দিষ্ট করা ভিউয়ের সাথে মেলে?"
কোলে

আমি মনে করি না যে কোনও এক্সটেনশানটি (এক্সএমএল, এইচটিএমএল, ইত্যাদি) মানচিত্রে। আপনি যদি ডিফল্ট রেন্ডারিং চয়ন করেন ( format.html- কোনও তর্ক নেই) এটি কনভেনশনগুলি (ইউআরএল এবং এইচটিটিপি ক্রিয়া উপর ভিত্তি করে) একটি ভিউ চয়ন করতে (HTML হিসাবে প্রত্যাশিত) ব্যবহার করবে। প্রতিক্রিয়াশীল (ফর্ম্যাট) এখানে দর্শনের জন্য এবং কনভেনশনগুলি ব্যবহার না করে json এ সিরিয়াল করে .json এ শেষ হওয়া URL গুলি রেন্ডার করার জন্য নির্দেশিত হয়েছে ।
ক্রেগ Celeste

উত্তর:


189

আমি রুবিতে নতুন এবং এই একই কোডটিতে আটকে গিয়েছি। আমি যে অংশগুলি ঝুলিয়েছিলাম সেগুলি এখানে পাওয়া উত্তরগুলির চেয়ে কিছুটা মৌলিক। এটি কারও সাহায্য বা নাও করতে পারে।

  • respond_toসুপারক্লাসে একটি পদ্ধতি ActionController
  • এটি একটি ব্লক লাগে, যা প্রতিনিধিদের মতো। ব্লক থেকে doপর্যন্ত endসঙ্গে, |format|ব্লক একটি আর্গুমেন্ট হিসাবে।
  • প্রতিক্রিয়া_আপনি আপনার ব্লক কার্যকর করে, formatযুক্তিতে কোনও প্রতিক্রিয়াশীলকে পাস করে ।

http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html

  • এর Responderজন্য .htmlবা কোনও পদ্ধতি ধারণ করে না .json, তবে আমরা যাইহোক এই পদ্ধতিগুলিকে কল করি! এই অংশটি আমাকে লুপের জন্য ফেলেছে।
  • রুবির একটি বৈশিষ্ট্য রয়েছে method_missing। আপনি যদি এমন কোনও পদ্ধতিতে কল করেন যা বিদ্যমান নেই (যেমন jsonবা html), রুবি তার method_missingপরিবর্তে পদ্ধতিটি কল করে ।

http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

  • Responderশ্রেণী তার ব্যবহার method_missingরেজিস্ট্রেশন এক ধরনের হিসাবে। আমরা যখন 'জসন' কল করি, আমরা জসনকে সিরিয়ালাইজ করে .json এক্সটেনশনের অনুরোধগুলির প্রতিক্রিয়া জানাতে বলি। htmlডিফল্ট উপায়ে (এইচটিএমএল অনুরোধগুলি হ্যান্ডেল করতে (কনভেনশন এবং দৃষ্টিভঙ্গি ব্যবহার করে) পরিচালনা করতে আমাদের কোনও যুক্তি ছাড়াই কল করতে হবে।

এটি এটি (জেএস-এর মতো সিউডোকোড ব্যবহার করে) লেখা যেতে পারে:

// get an instance to a responder from the base class
var format = get_responder()

// register html to render in the default way
// (by way of the views and conventions)
format.register('html')

// register json as well. the argument to .json is the second
// argument to method_missing ('json' is the first), which contains
// optional ways to configure the response. In this case, serialize as json.
format.register('json', renderOptions)

এই অংশটি হ্যাককে আমার থেকে বিভ্রান্ত করেছে। আমি এখনও এটি অপরিহার্য বলে মনে করি। রুবি এই কৌশলটি বেশ খানিকটা ব্যবহার করেছে বলে মনে হচ্ছে। সম্পূর্ণ শ্রেণি ( responder) পদ্ধতি বাস্তবায়নে পরিণত হয়। উত্তোলনের জন্য method_missing, আমাদের ক্লাসের একটি উদাহরণ প্রয়োজন, তাই আমরা একটি কলব্যাক পাস করতে বাধ্য হই যা তারা পদ্ধতিটির মতো অবজেক্টটি পাস করে। যে কেউ 20 বছর ধরে সি-এর মতো ভাষাগুলিতে কোড করেছেন, এটি আমার পক্ষে খুব পিছনে এবং অপ্রতিদ্বন্দ্বী। এটা খারাপ না! তবে এ জাতীয় ব্যাকগ্রাউন্ডের অনেক লোকের মাথা ঘুরে আসা দরকার, এবং আমি মনে করি ওপি পরে কী ছিল।

পিএস নোট করুন যে আরআর-তে 4.2 respond_toকে প্রতিক্রিয়াশীল রত্নের মধ্যে তোলা হয়েছিল ।


আপনাকে ক্রেগকে ধন্যবাদ, সেই লিঙ্কটিতে আসলে প্রচুর পরিমাণে দরকারী তথ্য ছিল, আমি বুঝতে পারিনি যে এটি দিয়ে কতটা সম্ভব সম্ভব method_missing, আপনি এটি যুক্তি এবং একটি ব্লক পাস করতে পারেন তা বিবেচনা করে !
আদিত্য এমপি

2
রেসপন্ডার ক্লাসে একটি রেজিস্ট্রেশন প্রক্রিয়া হিসাবে মেথড_মিসিং () ব্যবহারের ব্যাখ্যার জন্য সেরা উত্তর! আমিও এই কোডটি নিয়ে খুব বিভ্রান্ত ছিলাম ।
অ্যালান ইভাঞ্জেলিস্টা

1
6 টি স্কেলফোল্ড জেনারেটর respond_toনিয়ন্ত্রণকারীদের সাথে কোড উত্পাদন করে বলে মনে হয়, জেমফাইলে প্রতিক্রিয়াকারীদের রত্ন ছাড়া। সম্ভবত respond_toপ্রতিক্রিয়াশীল রত্নে তোলা সম্পর্কে বিটটি পরিবর্তন করা হয়েছে?
কাসিম

106

এটি রুবি কোডের একটি ব্লক যা একটি রেলস সহায়তাকারী পদ্ধতির সুবিধা নেয়। আপনি যদি এখনও ব্লকের সাথে পরিচিত না হন তবে আপনি এগুলিকে রুবিতে দেখতে পাবেন।

respond_toএটি একটি রেলস সহায়তাকারী পদ্ধতি যা নিয়ামক শ্রেণীর সাথে সংযুক্ত থাকে (বা বরং এটির সুপার বর্গ)। এটি প্রতিক্রিয়াটি উল্লেখ করছে যা ভিউতে প্রেরণ করা হবে (যা ব্রাউজারে যাচ্ছে)।

আপনার উদাহরণের ব্লকটি ডেটা ফর্ম্যাট করে - ব্লকের একটি 'ফর্ম্যাট' পরামিতি পেরিয়ে - যখনই কোনও ব্রাউজার এইচটিএমএল বা জেসন ডেটার জন্য কোনও অনুরোধ করে তখন তাকে নিয়ামক থেকে দর্শনে পাঠানো হবে।

আপনি যদি নিজের লোকাল মেশিনে থাকেন এবং আপনার পোষ্টের স্ক্যাফোল্ড সেট আপ হয় তবে আপনি যেতে পারেন http://localhost:3000/postsএবং আপনি আপনার সমস্ত পোস্ট এইচটিএমএল ফর্ম্যাটে দেখতে পাবেন। তবে, আপনি যদি এটি টাইপ করেন http://localhost:3000/posts.json:, তারপরে আপনি সার্ভার থেকে প্রেরিত জসন অবজেক্টে আপনার সমস্ত পোস্ট দেখতে পাবেন।

এটি জাভাস্ক্রিপ্ট ভারী অ্যাপ্লিকেশনগুলি তৈরি করার জন্য খুব কার্যকর যা সার্ভার থেকে জেসনকে পিছনে পিছনে যেতে হবে। আপনি যদি চান, আপনি সহজেই আপনার রেলগুলিতে ব্যাক-এন্ডে একটি জসন এপি তৈরি করতে পারেন এবং কেবলমাত্র একটি দর্শন পাস করতে পারেন - যেমন আপনার পোস্ট কন্ট্রোলারের সূচী দর্শন। তারপরে আপনি ডেটা ম্যানিপুলেট করতে এবং নিজের ইন্টারফেস তৈরি করতে Jquery বা ব্যাকবোন (বা উভয়) এর মতো একটি জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করতে পারেন । এগুলিকে অ্যাসিক্রোনাস ইউআই বলা হয় এবং এগুলি সত্যই জনপ্রিয় হয়ে উঠেছে (জিমেইল এক)। এগুলি খুব দ্রুত এবং শেষ ব্যবহারকারীকে ওয়েবে আরও ডেস্কটপের মতো অভিজ্ঞতা দেয়। অবশ্যই, এটি আপনার ডেটা ফর্ম্যাট করার একটাই সুবিধা।

রেল 3 এটি লেখার উপায় এটি হবে:

    class PostsController < ApplicationController
      # GET /posts
      # GET /posts.xml


      respond_to :html, :xml, :json

      def index
        @posts = Post.all

        respond_with(@posts)
      end

#
# All your other REST methods
#

end

respond_to :html, :xml, :jsonশ্রেণীর শীর্ষে রেখে আপনি আপনার নিয়ামককে আপনার মতামতে প্রেরণ করতে চান এমন সমস্ত ফর্ম্যাটগুলি ঘোষণা করতে পারেন।

তারপরে, কন্ট্রোলার পদ্ধতিতে আপনাকে যা করতে হবে তা হ'ল রেসপন্স_উইথ (@ যাইহোক_বজেক্ট_আপনি_হ্যাভ)

এটি কেবল আপনার কোডটিকে সরল করে দেয় যা রেলগুলি স্বয়ংক্রিয়ভাবে জেনারেট করে than

আপনি যদি এর অভ্যন্তরীণ কাজগুলি সম্পর্কে জানতে চান ...

আমি যা বুঝি সেগুলি থেকে, প্রকৃত বিন্যাসটি কী হতে চলেছে তা নির্ধারণের জন্য রেলগুলি বস্তুগুলিকে অন্তর্নির্মিত করে। 'বিন্যাস' ভেরিয়েবলের মানটি এই অন্তর্নির্ধারণের উপর ভিত্তি করে। রেয়েলগুলি সামান্য বিট তথ্য দিয়ে পুরো কাজটি করতে পারে। সরল @ পোষ্ট বা: পোস্ট কতটা দূরে যাবে সে সম্পর্কে আপনি অবাক হবেন।

উদাহরণস্বরূপ, যদি আমার কাছে _user.html.erb আংশিক ফাইল থাকে যা দেখতে এরকম দেখায়:

_user.html.erb

<li>    
    <%= link_to user.name, user %>
</li>

তারপরে, আমার সূচক দর্শনে এটিই একা রেলগুলিকে জানতে দেবে যে এটি 'ব্যবহারকারীর' আংশিক সন্ধান করা উচিত এবং সমস্ত 'ব্যবহারকারীর' অবজেক্টের মাধ্যমে পুনরাবৃত্তি করতে হবে:

index.html.erb

 <ul class="users">
   <%= render @users %>     
 </ul>

রেলগুলিকে জানাতে হবে যে এটি 'ব্যবহারকারীর' আংশিক এবং সমস্ত ব্যবহারকারীদের অবজেক্টের মাধ্যমে পুনরাবৃত্তি করা দরকার:

আপনি এই ব্লগ পোস্টে দরকারী এটি করতে পারেন: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with

আপনি উত্সটি অনুধাবন করতে পারেন: https://github.com/rails/rails


1
রেল 3 পথে দুর্দান্ত টিপ। আমি এখনও প্রতিক্রিয়া_তে ব্লকের নীচে এবং ব্লকের যুক্তিটি কী | বিন্যাসে নেওয়ার চেষ্টা করছি | পাস হয়ে যায়
কোল

4
উত্তম উত্তর তবে বিন্যাসে ভেরিয়েবলটি ব্লকে পাস হওয়ার বিষয়ে নির্দিষ্ট কিছু বলে না। প্রদত্ত উদাহরণে ফর্ম্যাট। Html এবং format.json রয়েছে - এই দুটি কি প্রতিক্রিয়া_তে উত্তীর্ণ হয় এবং তারপরে প্রতিক্রিয়া_ তাদের সিদ্ধান্ত নিয়ে কী সিদ্ধান্ত নেয়?
অ্যান্টনি

কবে respond_toএবং respond_withপরিচয় হয়? আমি রেলটি ২.৩.৫ ব্যবহার করছি এবং আমি পাচ্ছিNoMethodError (undefined method respond_to)
আবদু

10

আমি যা জানি, প্রতিক্রিয়া_এটি একশন কন্ট্রোলারের সাথে সংযুক্ত একটি পদ্ধতি, যাতে আপনি এটি প্রতিটি কন্ট্রোলারে ব্যবহার করতে পারেন, কারণ এগুলি সমস্তই অ্যাকশনকন্ট্রোলারের উত্তরাধিকার সূত্রে প্রাপ্ত। কারাগারের প্রতিক্রিয়া_র পদ্ধতিটি এখানে:

def respond_to(&block)
  responder = Responder.new(self)
  block.call(responder)
  responder.respond
end

আপনি এটিকে একটি ব্লক দিয়ে যাচ্ছেন , যেমন আমি এখানে দেখিয়েছি:

respond_to <<**BEGINNING OF THE BLOCK**>> do |format|
  format.html
  format.xml  { render :xml => @whatever }
end <<**END OF THE BLOCK**>>

| বিন্যাস | অংশটি হ'ল যুক্তি যা ব্লকটি প্রত্যাশা করে, তাই প্রতিক্রিয়া_ পদ্ধতির ভিতরে আমরা এটি ব্যবহার করতে পারি। কিভাবে?

ঠিক আছে, আপনি যদি লক্ষ্য করেন যে আমরা ব্লকটি একটি পূর্বনির্ধারিত এবং প্রতিক্রিয়া_ পদ্ধতিতে পাস করেছি, এবং আমরা সেই ব্লকটিকে একজন প্রোক হিসাবে বিবেচনা করব। যেহেতু আর্গুমেন্টটির ".xML", ".html" রয়েছে তাই আমরা এটিকে কল করার পদ্ধতি হিসাবে ব্যবহার করতে পারি।

আমরা রেসপন্স_তে ক্লাসে মূলত যা করি তা হ'ল একটি প্রতিক্রিয়াশীল শ্রেণীর উদাহরণ হিসাবে ".html, .xML, .json" কল পদ্ধতিগুলি।


1
আপনি যে উত্সটি অন্তর্ভুক্ত করেছেন তার থেকে এপিআই ডক্সে প্রতিক্রিয়া_র উত্সটি আমার থেকে আলাদা ছিল এবং আমাকে ফেলে দিচ্ছিল। আপনার স্নিপেটটি আমার কাছে এটি আরও পরিষ্কার করে দেয় যে ফর্ম্যাট ব্লক আর্গুমেন্টটি কোনও প্রতিক্রিয়াশীল বস্তুটি পাস হচ্ছে। প্রতিক্রিয়াশীল ডকুমেন্টেশন মনে হয় প্রশ্নের উত্তর দেয়, এখন তা পড়ে।
কোল

7

আমি কীভাবে প্রতিক্রিয়া_তে ব্লকটি কার্যকরভাবে কাজ করে তা বুঝতে চাই। বিন্যাসটি কি ধরণের পরিবর্তনশীল? বিন্যাস অবজেক্টের .html এবং .json পদ্ধতি কি?

কী formatতা বোঝার জন্য, আপনি প্রথমে উত্সটির দিকে নজর রাখতে পারেন respond_toতবে দ্রুত আপনি দেখতে পাবেন যে আপনাকে যা দেখতে হবে তা হল retrieve_response_from_mimes এর কোড ।

এখান থেকে, আপনি দেখতে পাবেন যে ব্লকটি respond_to(আপনার কোডে) গিয়েছিল, তাকে আসলে কালেক্টরের উদাহরণ দিয়ে কল করা এবং পাস করা হয় (যা ব্লকের মধ্যে উল্লেখ করা হয় format)। সংগ্রাহক মাইম প্রকারের রেলগুলি কী কী সম্পর্কে জানে তার উপর ভিত্তি করে মূলত পদ্ধতিগুলি (আমি রেলস স্টার্টআপে বিশ্বাস করি) তৈরি করে ।

সুতরাং, হ্যাঁ, .htmlএবং .jsonকালেক্টর (ওরফে format) শ্রেণিতে (রানটাইম এ) এবং পদ্ধতিগুলি সংজ্ঞায়িত হয় ।


2

উত্তরদাতাদের রেজিস্ট্রেশনের পিছনে মেটা-প্রোগ্রামিং (পার্চড স্কুইডের উত্তর দেখুন) এছাড়াও আপনাকে নিফটি স্টাফগুলি এমনভাবে করার অনুমতি দেয়:

def index
  @posts = Post.all

  respond_to do |format|
    format.html  # index.html.erb
    format.json  { render :json => @posts }
    format.csv   { render :csv => @posts }
    format.js
  end
end

আপনি /posts.csv এ গেলে প্রতিটি পোস্টে csv লাইনটি to_csv ডেকে আনে। এটি আপনার রেল সাইট থেকে সিএসভি (বা অন্য কোনও ফর্ম্যাট) হিসাবে ডেটা রফতানি করা সহজ করে তোলে।

জেএস লাইনটি একটি জাভাস্ক্রিপ্ট ফাইল /posts.js (বা /posts.js.c کافی) রেন্ডার / এক্সিকিউট করার কারণ ঘটায়। আমি খুঁজে পেয়েছি যে jQuery UI পপ-আপগুলি ব্যবহার করে একটি অ্যাজাক্স সক্ষমযোগ্য সাইট তৈরির জন্য হালকা ওজনের উপায়।


1

বিন্যাসটি কি ধরণের পরিবর্তনশীল?

জাভা পিওভি থেকে, ফর্ম্যাট হ'ল একটি বেনামে ইন্টারফেসের প্রয়োগ an এই ইন্টারফেসের প্রতিটি মাইম টাইপের জন্য একটি পদ্ধতি রয়েছে। আপনি যখন এই পদ্ধতিগুলির মধ্যে একটিটিকে (এটি একটি ব্লক পাস করে) আবেদন করেন, তবে যদি রেলগুলি মনে করে যে ব্যবহারকারী সেই সামগ্রীটির প্রকারটি চায়, তবে এটি আপনার ব্লকটিকে ডাকবে।

মোড়টি অবশ্যই, এই বেনামে আঠালো বস্তুটি আসলে কোনও ইন্টারফেস বাস্তবায়িত করে না - এটি পদ্ধতিটি কলটি গতিময়ভাবে ধরা দেয় এবং যদি এটির জানা মাইম টাইপের নাম হয় তবে এটি কার্যকর হয়।

ব্যক্তিগতভাবে, আমি মনে করি এটা অদ্ভুত দেখায়: ব্লক যে আপনার মধ্যে পাস হয় মৃত্যুদন্ড কার্যকর । ফর্ম্যাট লেবেল এবং ব্লকগুলির একটি হ্যাশ পাস করার বিষয়টি আমার কাছে আরও অর্থবোধ করে। তবে - এটি আরআর-তে কীভাবে সম্পন্ন হয়েছে, মনে হয়।


1

এটি খানিকটা পুরানো, রায়ান বিগ এখানে দুর্দান্ত ব্যাখ্যা দিয়ে দুর্দান্ত কাজ করেছেন:

http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to

আসলে, আপনি যা চেয়েছিলেন এটি চেয়ে আরও বিশদ হতে পারে। দেখা যাচ্ছে যে, মাইম টাইপগুলি কীভাবে লোড হয় তা বোঝার প্রয়োজন সহ পর্দার আড়ালে অনেক কিছু চলছে।


0

"ফর্ম্যাট" হ'ল আপনার প্রতিক্রিয়া প্রকার। উদাহরণস্বরূপ, জেসন বা এইচটিএমএল হতে পারে। এটি আপনার ভিজিটর যে আউটপুট গ্রহণ করবে তার ফর্ম্যাট।


0

আপনার আরও একটি বিষয় সম্পর্কে সচেতন হওয়া উচিত - মাইমেন।

আপনার যদি কোনও মাইম টাইম ব্যবহার করার প্রয়োজন হয় এবং এটি ডিফল্টরূপে সমর্থিত না হয় তবে আপনি নিজের নিজস্ব হ্যান্ডলারগুলি কনফিগারেশন / আরম্ভকারী / মাইম_টাইপস.আরবিতে নিবন্ধ করতে পারেন:

Mime::Type.register "text/markdown", :markdown

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