Ruby on Rails 5.2 - ActionDispatch::Routing

मॉड्यूल ActionDispatch :: रूटिंग




ruby

मॉड्यूल ActionDispatch :: रूटिंग

रूटिंग मॉड्यूल मूल रूबी में URL पुनर्लेखन प्रदान करता है। यह नियंत्रकों और कार्यों के लिए आने वाले अनुरोधों को पुनर्निर्देशित करने का एक तरीका है। यह mod_rewrite नियमों की जगह लेता है। सभी के सर्वश्रेष्ठ, रेल्स रूटिंग किसी भी वेब सर्वर के साथ काम करता है। रूट को config/routes.rb मार्गों में परिभाषित किया गया है।

अपने अनुरोधों के लिए एक मानचित्र बनाने के रूप में मार्ग बनाने के बारे में सोचें। नक्शा उन्हें बताता है कि कुछ पूर्वनिर्धारित पैटर्न के आधार पर कहां जाना है:

Rails.application.routes.draw do
  Pattern 1 tells some request to go to one place
  Pattern 2 tell them to go to another
  ...
end

निम्नलिखित प्रतीक विशेष हैं:

:controller maps to your controller name
:action     maps to an action with your controllers

अन्य नाम बस के रूप में एक पैरामीटर के नक्शे :id के मामले में।

साधन

संसाधन मार्ग आपको किसी दिए गए संसाधन नियंत्रक के लिए सभी सामान्य मार्गों को जल्दी से घोषित करने की अनुमति देता है। अपने index लिए अलग-अलग मार्गों की घोषणा करने के बजाय, show , new , edit , create , update और कार्यों destroy करें, एक संसाधन मार्ग उन्हें कोड की एक पंक्ति में घोषित करता है:

resources :photos

कभी-कभी, आपके पास एक संसाधन होता है जो क्लाइंट हमेशा एक आईडी को संदर्भित किए बिना देखते हैं। एक सामान्य उदाहरण, / प्रोफ़ाइल हमेशा उपयोगकर्ता में वर्तमान में लॉग की गई प्रोफ़ाइल दिखाता है। इस स्थिति में, आप शो कार्रवाई के लिए मैप / प्रोफाइल (बजाय / प्रोफाइल /: आईडी) के एक विलक्षण संसाधन का उपयोग कर सकते हैं।

resource :profile

ऐसे संसाधन होना आम है जो तार्किक रूप से अन्य संसाधनों के बच्चे हैं:

resources :magazines do
  resources :ads
end

आप एक नाम स्थान के तहत नियंत्रकों के समूह को व्यवस्थित करना चाह सकते हैं। आमतौर पर, आप एक admin नामस्थान के अंतर्गत कई प्रशासनिक नियंत्रकों का समूह बना सकते हैं। आप app/controllers/admin निर्देशिका के तहत इन नियंत्रकों को रखेंगे, और आप उन्हें अपने राउटर में एक साथ समूहित कर सकते हैं:

namespace "admin" do
  resources :posts, :comments
end

वैकल्पिक रूप से, आप scope का उपयोग करके एक अलग निर्देशिका का उपयोग किए बिना अपने उपसर्गों को जोड़ सकते हैं। scope अतिरिक्त विकल्प लेता है जो सभी संलग्न मार्गों पर लागू होता है।

scope path: "/cpanel", as: 'admin' do
  resources :posts, :comments
end

अधिक के लिए, Routing::Mapper::Resources#resources , Routing::Mapper::Scoping#namespace , और Routing::Mapper::Scoping#scope

गैर-संसाधन वाले मार्ग

उन मार्गों के लिए जो resources मोल्ड में फिट नहीं होते हैं, आप HTTP सहायक विधियों को get , post , patch , put और delete उपयोग कर सकते हैं।

get 'post/:id' => 'posts#show'
post 'post/:id' => 'posts#create_comment'

अब, यदि आप पोस्ट /posts/:id POST करते हैं, तो यह create_comment कार्रवाई का मार्ग होगा। उसी URL पर एक GET show कार्रवाई के लिए मार्ग देगा।

यदि आपके मार्ग को एक से अधिक HTTP विधि (या सभी विधियों) पर प्रतिक्रिया देने की आवश्यकता है, तो :via match :via विकल्प का उपयोग करना बेहतर होता है।

match 'post/:id' => 'posts#show', via: [:get, :post]

नामित मार्ग

मार्गों का नामकरण :as एक विकल्प के :as , अपने स्रोत के भीतर आसान संदर्भ के लिए अनुमति देने के :as किया जा सकता है जैसे कि name_of_route_url पूरा URL और name_of_route_path URI पथ के लिए।

उदाहरण:

# In config/routes.rb
get '/login' => 'accounts#login', as: 'login'

# With render, redirect_to, tests, etc.
redirect_to login_url

तर्क भी पारित किए जा सकते हैं।

redirect_to show_item_path(id: 25)

रूट पथ "/" के लिए एक मार्ग का नाम रखने के लिए एक शॉर्टहैंड के रूप में root उपयोग करें।

# In config/routes.rb
root to: 'blogs#index'

# would recognize http://www.example.com/ as
params = { controller: 'blogs', action: 'index' }

# and provide these named routes
root_url   # => 'http://www.example.com/'
root_path  # => '/'

नोट: controller का उपयोग करते समय, रूट को केवल उस विधि के नाम पर रखा जाता है जिसे आप ब्लॉक पैरामीटर पर कहते हैं न कि नक्शे के बजाय।

# In config/routes.rb
controller :blog do
  get 'blog/show'     => :list
  get 'blog/delete'   => :delete
  get 'blog/edit'     => :edit
end

# provides named routes for show, delete, and edit
link_to @article.title, blog_show_path(id: @article.id)

सुंदर यूआरएल

रूट सुंदर URL उत्पन्न कर सकते हैं। उदाहरण के लिए:

get '/articles/:year/:month/:day' => 'articles#find_by_id', constraints: {
  year:       /\d{4}/,
  month:      /\d{1,2}/,
  day:        /\d{1,2}/
}

उपरोक्त मार्ग का उपयोग करते हुए, URL " लोकलहोस्ट: 3000 / लेख / 2005/11/06 " मैप करता है

params = {year: '2005', month: '11', day: '06'}

नियमित अभिव्यक्ति और पैरामीटर

आप एक पैरामीटर के लिए एक प्रारूप को परिभाषित करने के लिए एक नियमित अभिव्यक्ति निर्दिष्ट कर सकते हैं।

controller 'geocode' do
  get 'geocode/:postalcode' => :show, constraints: {
    postalcode: /\d{5}(-\d{4})?/
  }
end

बाधाओं में 'अज्ञानता' और 'विस्तारित वाक्यविन्यास' नियमित अभिव्यक्ति संशोधक शामिल हो सकते हैं:

controller 'geocode' do
  get 'geocode/:postalcode' => :show, constraints: {
    postalcode: /hx\d\d\s\d[a-z]{2}/i
  }
end

controller 'geocode' do
  get 'geocode/:postalcode' => :show, constraints: {
    postalcode: /# Postalcode format
       \d{5} #Prefix
       (-\d{4})? #Suffix
       /x
  }
end

मल्टीलाइन मॉडिफायर का उपयोग एक ArgumentError बढ़ाएगा। नियमित एक्सप्रेशन मोडिफ़ाइक को एन्कोड करने को चुपचाप नज़रअंदाज़ कर दिया जाता है। मैच हमेशा डिफ़ॉल्ट एन्कोडिंग या ASCII का उपयोग करेगा।

बाहरी पुनर्निर्देश

आप अपने राउटर में रीडायरेक्ट हेल्पर का उपयोग करके किसी भी पथ को दूसरे पथ पर पुनर्निर्देशित कर सकते हैं:

get "/stories" => redirect("/posts")

यूनिकोड चरित्र मार्ग

आप अपने राउटर में यूनिकोड वर्ण मार्गों को निर्दिष्ट कर सकते हैं:

get "こんにちは" => "welcome#index"

रैक अनुप्रयोगों के लिए Routing

String बजाय, जैसे posts#index , जो पोस्टकंट्रोलर में इंडेक्स एक्शन से मेल खाती है, आप किसी भी रैक एप्लिकेशन को एक मिलानकर्ता के लिए समापन बिंदु के रूप में निर्दिष्ट कर सकते हैं:

get "/application.js" => Sprockets

रिलोडिंग रूट

आप मार्गों को पुनः लोड कर सकते हैं यदि आपको लगता है कि आपको चाहिए:

Rails.application.reload_routes!

यह सभी नामित मार्गों को साफ करेगा और यदि फाइल को पिछले लोड से संशोधित किया गया है तो config / मार्गों को पुनः लोड करें। पूरी तरह से reload! करने के लिए, reload! उपयोग करें reload!

परीक्षण मार्गों

अपने मार्गों के परीक्षण के लिए दो मुख्य तरीके:

assert_routing

def test_movie_route_properly_splits
 opts = {controller: "plugin", action: "checkout", id: "2"}
 assert_routing "plugin/checkout/2", opts
end

assert_routing आपको यह assert_routing देता है कि मार्ग ठीक से विकल्पों में है या नहीं।

assert_recognizes

def test_route_has_options
 opts = {controller: "plugin", action: "show", id: "12"}
 assert_recognizes opts, "/plugins/show/12"
end

दोनों के बीच के सूक्ष्म अंतर पर ध्यान दें: assert_routing परीक्षण जो URL को विकल्पों में फिट करता है जबकि assert_recognizes परीक्षण करता है कि URL ठीक से मापदंडों में टूटता है।

परीक्षणों में आप get या post करने के get बस URL या नामित मार्ग पास कर सकते हैं।

def send_to_jail
  get '/jail'
  assert_response :success
end

def goes_to_login
  get login_url
  #...
end

अपने सभी मार्गों की सूची देखें

rails routes

-C विकल्प के साथ कमांड को उपसर्ग करके विशिष्ट नियंत्रकों को लक्षित करें।