কড়া প্রতিক্রিয়া_ও: এটি কীভাবে কাজ করে?


128

আমি এখানে এবং সেখানে পড়েছিলাম respond_withপদ্ধতিটি কতটা শীতল R এর মধ্যে রয়েছে তবে আমি এমনকি এটির একটিও এপিএলগুলিতে বা উত্সটি অনুসন্ধান করে খুঁজে পাচ্ছি না। এটি যেভাবে কাজ করে তা কেউ আমাকে ব্যাখ্যা করতে পারেন (আপনি কী কী বিকল্পগুলি ব্যবহার করতে পারেন ইত্যাদি) বা আমাকে এটি যে জায়গায় প্রয়োগ করা হয়েছে তার দিকে নির্দেশ করতে পারে যাতে আমি নিজের কোডটি ব্যবহার করতে পারি?

উত্তর:


128

4.2+ রেলের জন্য আপডেট

#respond_withএবং ::respond_to( বিশেষ দ্রষ্টব্য বর্গ পদ্ধতি) হয় আর পাগল এর একটি অংশ । তারা তৃতীয়-দলে স্থানান্তরিত হয়েছিল ails.২ রেল ( প্রতিক্রিয়াশীল রত্নে R.২ ( প্রকাশিত নোট / অগাস্ট ২০১৪ তারিখের প্রতিশ্রুতি ))। প্রতিক্রিয়াকারীদের ডিফল্টরূপে কারাগুলিতে অন্তর্ভুক্ত করা হয়নি, এটি ডিভাইসের নির্ভরতা এবং এর ফলে অনেকগুলি রেল অ্যাপ্লিকেশনগুলিতে পাওয়া যায়।

দ্য #respond_to উদাহরণ হিসেবে বলা যায় পদ্ধতি, তবে হয় এখনো পাগল একটা অংশ (5.2rc1 এই লেখার হিসাবে)।

অফিসিয়াল রেলস এপিআই ডকুমেন্টেশন ActionController::MimeRespondsকীভাবে #respond_toকাজ করে তা ব্যাখ্যা করে। আসল রেল গাইড নথির জন্য ডকুমেন্টেশন মন্তব্য#respond_with এবং ::respond_toএখনও উত্তরদাতাদের রত্ন উত্স কোডে পাওয়া যায় ।


আসল উত্তর

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


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

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


সূক্ষ্ম টুইটগুলি থেকে সম্পূর্ণরূপে আচরণকে ওভাররাইডিং বা প্রসারিত করার ক্ষেত্রে প্রতিক্রিয়াশীলরা কীভাবে আচরণ করে তা কাস্টমাইজ করার কয়েকটি সুযোগ রয়েছে।

শ্রেণী স্তর: respond_to

এখানে আপনি যে ফর্ম্যাটগুলি প্রতিক্রিয়াশীলকে পরিচালনা করতে হবে তা নির্দিষ্ট করে দিন। ফর্ম্যাটগুলি কাস্টমাইজ করা যেতে পারে যে সেগুলি কোন ক্রিয়াতে প্রযোজ্য হবে। প্রতিটি বিন্যাসের জন্য ক্রিয়াগুলির সম্পূর্ণ কাস্টমাইজেশনকে মঞ্জুরি দিয়ে পৃথক কল সহ প্রতিটি ফর্ম্যাট নির্দিষ্ট করা যেতে পারে।

# Responds to html and json on all actions
respond_to :html, :json

# Responds to html and json on index and show actions only.
respond_to :html, :json, :only => [:index,:show]

# Responds to html for everything except show, and json only for index, create and update
respond_to :html, :except => [:show]
respond_to :json, :only => [:index, :create, :update]

শ্রেণী স্তর: responder

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

class SomeController < ApplicationController
  respond_to :json

  self.responder = proc do |controller, resources, options|
    resource = resources.last
    request = controller.request
    if request.get?
      controller.render json: resource
    elsif request.post? or request.put?
      if resource.errors.any?
        render json: {:status => 'failed', :errors => resource.errors}
      else
        render json: {:status => 'created', :object => resource}
      end
    end
  end
end

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

ইনস্ট্যান্স স্তর: respond_with

এখানে বিকল্পগুলি হ'ল যা আপনার নিয়ামককে রেন্ডার বা পুনর্নির্দেশের জন্য পাস করা হবে তবে সেগুলি কেবল সাফল্যের দৃশ্যের জন্য অন্তর্ভুক্ত। জিইটি ক্রিয়াকলাপগুলির জন্য এগুলি রেন্ডার কলগুলি হবে, অন্যান্য ক্রিয়াকলাপের জন্য এটি পুনর্নির্দেশের বিকল্প হবে। সম্ভবত এর মধ্যে সবচেয়ে দরকারী হ'ল :locationবিকল্পটি, যা উত্তর_আর যুক্তিগুলি সঠিক URL তৈরি করতে যথেষ্ট না হলে ক্ষেত্রে পুনঃনির্দেশের পথটিকে ওভাররাইড করতে ব্যবহার করা যেতে পারে।

# These two are essentially equal
respond_with(:admin, @user, @post)
respond_with(@post, :location => admin_user_post(@user, @post)

# Respond with a 201 instead of a 200 HTTP status code, and also
# redirect to the collection path instead of the resource path
respond_with(@post, :status => :created, :location => posts_path)

# Note that if you want to pass a URL with a query string
# then the location option would be needed.
# /users?scope=active
respond_with(@user, :location => users_path(:scope => 'active'))

বিকল্প হিসাবে, প্রতিক্রিয়াশীল জহর কেবলমাত্র কিছু ডিফল্ট আচরণকে ওভাররাইড করার জন্য কিছু মডিউল সরবরাহ করে না। এটি একটি বেনাম শ্রেণীর সাথে ডিফল্ট প্রতিক্রিয়াশীলকে ওভাররাইড করে যা ডিফল্ট প্রতিক্রিয়াকারীকে প্রসারিত করে এবং এই শ্রেণিতে কাস্টম মডিউলগুলিতে মিশ্রণের জন্য একটি শ্রেণির স্তরের পদ্ধতি সরবরাহ করে। এখানে সর্বাধিক দরকারী হ'ল ফ্ল্যাশ রেসপনার, যা ডিফল্টরূপে I18n সিস্টেমে কাস্টমাইজেশনকে ডেলিভারি করে ফ্ল্যাশগুলির একটি ডিফল্ট সেট সরবরাহ config/locales/en.ymlকরে।

পূর্ববর্তী প্রকল্পগুলিতে আমি কাস্টম প্রতিক্রিয়াকারীদের কয়েকটি উদাহরণ ব্যবহার করেছি এমন একটি প্রতিক্রিয়া অন্তর্ভুক্ত রয়েছে যা স্বয়ংক্রিয়ভাবে আমার সংস্থানগুলি সজ্জিত করে এবং পৃষ্ঠার শিরোনামটি সহজেই কাস্টমাইজ বা ওভাররাইড করার জন্য একটি ইন্টারফেসের সাথে পৃষ্ঠা শিরোনামগুলির একটি ডিফল্ট সেট সরবরাহ করে।


1
আমার মনে হয় আপনার অর্থ ( self.responder =responder =
শ্রেণিকৃষ্ঠে

ধন্যবাদ! locationঅপশনটির অস্তিত্ব ছিল আমার প্রয়োজনীয় তথ্য!
জেলিকেলকিগ

1
সেই ব্যাখ্যাটি কি এখনও 4/5 জেলগুলির জন্য প্রাসঙ্গিক? শুনেছি respond_withএটিকে অবমূল্যায়ন করা হবে, তবে কেন তা খুঁজে বের করার ব্যবস্থা করি না।
আর্লেন

1
@ আর্নল, রেসপন্স_ও আলাদা জহর ' প্রতিক্রিয়াকারী ' হিসাবে তোলা হয়েছিল
নিক রোজ

মনে রাখবেন যে আপনার config/locales/en.ymlকাজ করার জন্য ফ্ল্যাশগুলির responders :flashজন্য আপনার নিয়ামকের শীর্ষে থাকা দরকার ।
বিজেএনর্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.