Ruby on Rails 5.2 - ActionController::Base

क्लास एक्शनकंट्रोलर :: बेस




ruby

क्लास एक्शनकंट्रोलर :: बेस

जनक:
धातु

एक्शन कंट्रोलर्स रेल में एक वेब अनुरोध के मूल हैं। वे एक या एक से अधिक क्रियाओं से बने होते हैं जिन्हें अनुरोध पर निष्पादित किया जाता है और फिर या तो यह एक टेम्पलेट प्रदान करता है या किसी अन्य कार्रवाई को रीडायरेक्ट करता है। नियंत्रक पर एक क्रिया को एक सार्वजनिक विधि के रूप में परिभाषित किया गया है, जो स्वचालित रूप से रेल रूट के माध्यम से वेब-सर्वर के लिए सुलभ हो जाएगा।

डिफ़ॉल्ट रूप से, केवल ActionController::Base से ActionController::Base इन द रेल्स एप्लीकेशन। अन्य सभी नियंत्रक ApplicationController से विरासत में मिलते हैं। यह आपको अनुरोध फर्जी सुरक्षा और संवेदनशील अनुरोध मापदंडों को फ़िल्टर करने जैसी चीजों को कॉन्फ़िगर करने के लिए एक वर्ग देता है।

एक नमूना नियंत्रक इस तरह दिख सकता है:

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def create
    @post = Post.create params[:post]
    redirect_to posts_path
  end
end

क्रिया, डिफ़ॉल्ट रूप से, app/views डायरेक्टरी में एक टेम्प्लेट को प्रस्तुत करता है जो क्रिया में कोड निष्पादित करने के बाद नियंत्रक और कार्रवाई के नाम के अनुरूप होता है। उदाहरण के लिए, PostController की index कार्रवाई @posts उदाहरण चर को @posts बाद डिफ़ॉल्ट रूप से टेम्पलेट app/views/posts/index.html.erb प्रस्तुत करेगी।

इंडेक्स के विपरीत, क्रिएट एक्शन किसी टेम्पलेट को रेंडर नहीं करेगा। अपने मुख्य उद्देश्य (एक नई पोस्ट बनाने) के प्रदर्शन के बाद, यह इसके बजाय एक रीडायरेक्ट शुरू करता है। यह पुनर्निर्देशित एक बाहरी 302 Moved HTTP प्रतिक्रिया को वापस करके काम करता है जो उपयोगकर्ता को अनुक्रमणिका कार्रवाई में ले जाता है।

ये दो विधियां एक्शन कंट्रोलर्स में उपयोग किए जाने वाले दो बुनियादी एक्शन आर्कटाइप्स का प्रतिनिधित्व करती हैं: गेट-एंड-शो और डू-एंड-रीडायरेक्ट। अधिकांश क्रियाएं इन थीमों पर विविधताएं हैं।

अनुरोध

प्रत्येक अनुरोध के लिए, राउटर controller और action कुंजी का मूल्य निर्धारित करता है। ये निर्धारित करते हैं कि किस नियंत्रक और क्रिया को कहा जाता है। शेष अनुरोध पैरामीटर, सत्र (यदि कोई उपलब्ध है), और सभी HTTP हेडर के साथ पूर्ण अनुरोध एक्सेसर विधियों के माध्यम से कार्रवाई के लिए उपलब्ध कराया जाता है। फिर कार्रवाई की जाती है।

पूर्ण अनुरोध ऑब्जेक्ट अनुरोध एक्सेसर के माध्यम से उपलब्ध है और मुख्य रूप से HTTP हेडर के लिए क्वेरी के लिए उपयोग किया जाता है:

def server_ip
  location = request.env["REMOTE_ADDR"]
  render plain: "This server hosted at #{location}"
end

Parameters

सभी अनुरोध पैरामीटर, चाहे वे URL में एक क्वेरी स्ट्रिंग से आते हैं या एक POST अनुरोध के माध्यम से सबमिट किए गए डेटा params पद्धति के माध्यम से उपलब्ध होते हैं जो एक हैश देता है। उदाहरण के लिए, एक क्रिया जो /posts?category=All&limit=5 माध्यम से की गई थी /posts?category=All&limit=5 में { "category" => "All", "limit" => "5" }

कोष्ठक का उपयोग करके कुंजियों को निर्दिष्ट करके बहु-आयामी पैरामीटर हैश का निर्माण करना भी संभव है, जैसे:

<input type="text" name="post[name]" value="david">
<input type="text" name="post[address]" value="hyacintvej">

इन सूचनाओं को रखने वाले एक फॉर्म से आने वाले अनुरोध में { "post" => { "name" => "david", "address" => "hyacintvej" } } । यदि पता इनपुट को post[address][street] नाम दिया गया था, तो params में { "post" => { "address" => { "street" => "hyacintvej" } } } । घोंसले के शिकार की गहराई की कोई सीमा नहीं है।

सत्र

सत्र आपको अनुरोधों के बीच वस्तुओं को संग्रहीत करने की अनुमति देते हैं। यह उन वस्तुओं के लिए उपयोगी है जो अभी तक बने रहने के लिए तैयार नहीं हैं, जैसे कि एक बहु-पृष्ठित प्रक्रिया में निर्मित साइनअप ऑब्जेक्ट, या ऐसी वस्तुएँ जो बहुत अधिक नहीं बदलती हैं और हर समय आवश्यक होती हैं, जैसे किसी सिस्टम के लिए उपयोगकर्ता ऑब्जेक्ट इसके लिए लॉगिन आवश्यक है। सत्र का उपयोग नहीं किया जाना चाहिए, हालांकि, वस्तुओं के लिए कैश के रूप में जहां यह संभावना है कि उन्हें अनजाने में बदला जा सकता है। यह आमतौर पर बहुत काम है यह सब सिंक्रनाइज़ रखने के लिए - कुछ डेटाबेस पहले से ही पर एक्सेल।

आप session विधि का उपयोग करके सत्र में वस्तुओं को रख सकते हैं, जो हैश तक पहुँचता है:

session[:person] = Person.authenticate(user_name, password)

आप इसे उसी हैश के माध्यम से फिर से प्राप्त कर सकते हैं:

Hello #{session[:person]}

सत्र से ऑब्जेक्ट हटाने के लिए, आप या तो nil को एक कुंजी सौंप सकते हैं:

# removes :person from session
session[:person] = nil

या आप पूरे सत्र को reset_session निकाल सकते हैं।

एक ब्राउज़र कुकी में सत्रों को डिफ़ॉल्ट रूप से संग्रहीत किया जाता है जो क्रिप्टोग्राफिक रूप से हस्ताक्षरित है, लेकिन अनएन्क्रिप्टेड है। यह उपयोगकर्ता को सत्र के साथ छेड़छाड़ करने से रोकता है, लेकिन उन्हें इसकी सामग्री को देखने की अनुमति भी देता है।

कुकी-आधारित सत्रों में गुप्त जानकारी न डालें!

जवाब

प्रत्येक क्रिया एक प्रतिक्रिया के रूप में होती है, जो उपयोगकर्ता के ब्राउज़र में भेजे जाने वाले हेडर और दस्तावेज़ रखती है। वास्तविक प्रतिक्रिया ऑब्जेक्ट स्वचालित रूप से रेंडरर्स और रीडायरेक्ट के उपयोग के माध्यम से उत्पन्न होता है और इसके लिए किसी उपयोगकर्ता के हस्तक्षेप की आवश्यकता नहीं होती है।

renders

क्रिया नियंत्रक पाँच रेंडरिंग विधियों में से एक का उपयोग करके उपयोगकर्ता को सामग्री भेजता है। सबसे बहुमुखी और आम एक टेम्पलेट का प्रतिपादन है। एक्शन पैक में शामिल एक्शन व्यू है, जो ईआरबी टेम्प्लेट के प्रतिपादन में सक्षम बनाता है। यह स्वचालित रूप से कॉन्फ़िगर किया गया है। नियंत्रक उदाहरण चर को निर्दिष्ट करके ऑब्जेक्ट को पास करता है:

def show
  @post = Post.find(params[:id])
end

जो तब देखने के लिए स्वचालित रूप से उपलब्ध हैं:

Title: <%= @post.title %>

आपको स्वचालित रेंडरिंग पर भरोसा करने की ज़रूरत नहीं है। उदाहरण के लिए, अलग-अलग टेम्प्लेट के प्रतिपादन के परिणामस्वरूप होने वाली क्रियाएं मैन्युअल रेंडरिंग विधियों का उपयोग करेंगी:

def search
  @results = Search.find(params[:query])
  case @results.count
    when 0 then render action: "no_results"
    when 1 then render action: "show"
    when 2..10 then render action: "show_many"
  end
end

ActionView::Base में ActionView::Base और बिल्डर टेम्प्लेट लिखने के बारे में अधिक पढ़ें।

पुनर्निर्देश

रीडायरेक्ट का उपयोग एक क्रिया से दूसरे में जाने के लिए किया जाता है। उदाहरण के लिए, create एक्शन के बाद, जो डेटाबेस में ब्लॉग प्रविष्टि को संग्रहीत करता है, हम उपयोगकर्ता को नई प्रविष्टि दिखाना चाहेंगे। क्योंकि हम अच्छे DRY सिद्धांतों का पालन कर रहे हैं (खुद को दोहराएं नहीं), हम एक show कार्रवाई के लिए पुन: उपयोग (और पुनर्निर्देशित) करने जा रहे हैं जो हम पहले ही बना चुके हैं। कोड इस तरह दिख सकता है:

def create
  @entry = Entry.new(params[:entry])
  if @entry.save
    # The entry was saved correctly, redirect to show
    redirect_to action: 'show', id: @entry.id
  else
    # things didn't go so well, do something else
  end
end

इस मामले में, डेटाबेस में हमारी नई प्रविष्टि को सहेजने के बाद, उपयोगकर्ता को show विधि पर पुनर्निर्देशित किया जाता है, जिसे तब निष्पादित किया जाता है। ध्यान दें कि यह एक बाहरी HTTP-level पुनर्निर्देशन है जो ब्राउज़र को दूसरा अनुरोध करने के लिए कारण बनेगा (शो कार्रवाई के लिए GET), न कि कुछ आंतरिक री-रूटिंग, जो एक अनुरोध के भीतर दोनों "create" और फिर "show" कहता है। ।

ActionController::Redirecting और ActionController::Redirecting में आपके पास क्या विकल्प हैं: redirect_to बारे में अधिक जानें।

एकाधिक रीडायरेक्ट या कॉल करना

एक कार्रवाई में केवल एक ही रेंडर या एकल पुनर्निर्देशित हो सकता है। या तो फिर से प्रयास करने का प्रयास करने के परिणामस्वरूप DoubleRenderError होगी:

def do_something
  redirect_to action: "elsewhere"
  render action: "overthere" # raises DoubleRenderError
end

यदि आपको किसी चीज़ की स्थिति पर पुनर्निर्देशित करने की आवश्यकता है, तो निष्पादन को रोकने के लिए "और वापस" जोड़ना सुनिश्चित करें।

def do_something
  redirect_to(action: "elsewhere") and return if monkeys.nil?
  render action: "overthere" # won't be called if monkeys is nil
end

स्थिरांक

मॉड्यूल
PROTECTED_IVARS

कुछ आंतरिक चर को परिभाषित करें जिन्हें दृश्य में प्रचारित नहीं किया जाना चाहिए।

पब्लिक क्लास के तरीके

make_response! (अनुरोध) स्रोत दिखाएँ
# File actionpack/lib/action_controller/base.rb, line 267
def self.make_response!(request)
  ActionDispatch::Response.create.tap do |res|
    res.request = request
  end
end
बिना_मॉड्यूल (* मॉड्यूल) स्रोत दिखाएं
# File actionpack/lib/action_controller/base.rb, line 197
def self.without_modules(*modules)
  modules = modules.map do |m|
    m.is_a?(Symbol) ? ActionController.const_get(m) : m
  end

  MODULES - modules
end

शॉर्टकट हेल्पर जो ActionController::Base में शामिल सभी मॉड्यूल ActionController::Base तर्कों को छोड़कर पारित किया गया:

class MyBaseController < ActionController::Metal
  ActionController::Base.without_modules(:ParamsWrapper, :Streaming).each do |left|
    include left
  end
end

यह उस चीज़ पर बेहतर नियंत्रण देता है जिसे आप बाहर करना चाहते हैं और मैन्युअल रूप से आवश्यक मॉड्यूल को सूचीबद्ध करने के बजाय एक नंगे नियंत्रक वर्ग बनाना आसान बनाता है।

सार्वजनिक प्रवृत्ति के तरीके

# File actionpack/lib/action_controller/base.rb, line 179
    

एक ActionDispatch::Request उदाहरण वर्तमान अनुरोध का प्रतिनिधित्व करता है।

प्रतिक्रिया () स्रोत दिखाएँ
# File actionpack/lib/action_controller/base.rb, line 185
    

एक ActionDispatch::Response लौटाता है ActionDispatch::Response जो वर्तमान प्रतिक्रिया का प्रतिनिधित्व करती है।