Ruby on Rails 5.2 - ActionDispatch::Routing::UrlFor

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




ruby

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

शामिल मॉड्यूल:
ActionDispatch::Routing::PolymorphicRoutes

config/routes.rb आप URL-से-कंट्रोलर मैपिंग को परिभाषित करते हैं, लेकिन इसका उल्टा भी संभव है: एक URL आपकी रूटिंग परिभाषाओं में से एक से उत्पन्न हो सकता है। URL मॉड्यूल की कार्यक्षमता इस मॉड्यूल में केंद्रीकृत है।

देखें ActionDispatch::Routing मार्ग और मार्गों के बारे में सामान्य जानकारी के लिए ActionDispatch::Routing

युक्ति: यदि आपको अपने मॉडल या किसी अन्य स्थान से URL जनरेट करने की आवश्यकता है, तो ActionController::UrlFor वह है जो आप खोज रहे हैं। परिचय के लिए आगे पढ़ें। सामान्य तौर पर, इस मॉड्यूल को अपने आप में शामिल नहीं किया जाना चाहिए, क्योंकि यह आमतौर पर Rails.application ( Rails.application .routes.url_helpers के रूप में) द्वारा शामिल किया जाता है।

मापदंडों से URL पीढ़ी

जैसा कि आप जानते हैं, कुछ कार्य, जैसे कि ActionController :: Base # url_for और ActionView::Helpers::UrlHelper#link_to # link_to, पैरामीटर सेट किए गए URL जनरेट कर सकते हैं। उदाहरण के लिए, आपको संभवतः अपने विचारों में से एक में इस तरह कोड लिखने का मौका मिला है:

<%= link_to('Click here', controller: 'users',
        action: 'new', message: 'Welcome!') %>
# => <a href="/users/new?message=Welcome%21">Click here</a>

link_to, और अन्य सभी फ़ंक्शन जिनके लिए URL पीढ़ी कार्यक्षमता की आवश्यकता होती है, वास्तव में ActionController::UrlFor हुड के तहत उपयोग करते हैं। और विशेष रूप से, वे ActionController :: UrlFor # url_for विधि का उपयोग करते हैं। एक निम्नलिखित कोड का उपयोग करके उपरोक्त उदाहरण के समान पथ उत्पन्न कर सकता है:

include UrlFor
url_for(controller: 'users',
        action: 'new',
        message: 'Welcome!',
        only_path: true)
# => "/users/new?message=Welcome%21"

only_path: true को only_path: true भाग। ऐसा इसलिए है क्योंकि UrlFor को वेबसाइट होस्टनाम के बारे में कोई जानकारी नहीं है कि आपका रेल एप्लिकेशन क्या सेवा कर रहा है। इसलिए यदि आप hostname को भी शामिल करना चाहते हैं, तो आपको यह भी पास करना होगा :host तर्क:

include UrlFor
url_for(controller: 'users',
        action: 'new',
        message: 'Welcome!',
        host: 'www.example.com')
# => "http://www.example.com/users/new?message=Welcome%21"

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

सुविधा कारणों से, मेलर्स ActionController :: UrlFor # url_for के लिए एक शॉर्टकट प्रदान करते हैं। इसलिए मेलर्स के भीतर, आपको केवल 'ActionController :: UrlFor # url_for' के बजाय url_for पूरा लिखना होगा। हालाँकि, मेलर्स के पास होस्टनाम जानकारी नहीं है, और आपको अभी भी प्रदान करना है :host तर्क या डिफ़ॉल्ट होस्ट सेट करें जो कॉन्फ़िगरेशन विकल्प config.action_mailer.default_url_options का उपयोग करके सभी मेलर्स में उपयोग किया जाएगा। मेलर्स में #url_for में अधिक जानकारी के लिए ActionMailer # बेस डॉक्यूमेंटेशन पढ़ें।

नामित मार्गों के लिए URL पीढ़ी

UrlFor उन तरीकों को भी एक्सेस करने की अनुमति देता है जो नामित मार्गों से ऑटो-जनरेट किए गए हैं। उदाहरण के लिए, मान लें कि आपके पास अपने config/routes.rb में 'उपयोगकर्ता' संसाधन हैं।

resources :users

यह अन्य चीजों के बीच उत्पन्न करता है, विधि users_path । डिफ़ॉल्ट रूप से, यह विधि आपके नियंत्रकों, विचारों और मेलर्स से सुलभ है। यदि आपको अन्य स्थानों (जैसे कि एक मॉडल) से इस ऑटो-जेनरेटेड विधि का उपयोग करने की आवश्यकता है, तो आप अपनी कक्षा में Rails.application .routes.url_helpers को शामिल करके ऐसा कर सकते हैं:

class User < ActiveRecord::Base
  include Rails.application.routes.url_helpers

  def base_uri
    user_path(self)
  end
end

User.find(1).base_uri # => "/users/1"

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

# File actionpack/lib/action_dispatch/routing/url_for.rb, line 106
def initialize(*)
  @_routes = nil
  super
end
सुपरक्लास विधि कहता है

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

path_for (नाम, * args) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 212
def route_for(name, *args)
  public_send(:"#{name}_url", *args)
end

सीधे या नियमित रूप से नामित मार्ग को कॉल करने की अनुमति देता है।

resources :buckets

direct :recordable do |recording|
  route_for(:bucket, recording.bucket)
end

direct :threadable do |threadable|
  route_for(:recordable, threadable.parent)
end

यह मूल कॉलर के संदर्भ को बनाए रखता है, चाहे वह पथ या पूर्ण URL लौटाए, उदाहरण के लिए:

threadable_path(threadable)  # => "/buckets/1"
threadable_url(threadable)   # => "http://example.com/buckets/1"
url_for (विकल्प = nil) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 168
def url_for(options = nil)
  full_url_for(options)
end

उपलब्ध कराए गए विकल्पों, default_url_options और मार्गों में परिभाषित मार्गों के आधार पर एक URL बनाएँ। निम्नलिखित विकल्प समर्थित हैं:

  • :only_path - यदि सही है, तो संबंधित URL लौटा दिया गया है। false अवहेलना करता false

  • :protocol - कनेक्ट करने के लिए प्रोटोकॉल। 'Http' की कमी।

  • :host - :host निर्दिष्ट करता है कि लिंक को लक्षित किया जाना चाहिए। यदि :only_path गलत है, तो यह विकल्प या तो स्पष्ट रूप से प्रदान किया जाना चाहिए, या default_url_options माध्यम से।

  • :subdomain - लिंक के उपडोमेन को निर्दिष्ट करता है, मेजबान से उपडोमेन को विभाजित करने के लिए tld_length का उपयोग करता है। यदि गलत है, तो लिंक के होस्ट भाग से सभी उप-डोमेन हटा देता है।

  • :domain - होस्ट से डोमेन को विभाजित करने के लिए tld_length का उपयोग करके लिंक के डोमेन को निर्दिष्ट करता है।

  • :tld_length - TLD आईडी से बने लेबल की संख्या, केवल तभी उपयोग की जाती है यदि :subdomain या :domain की आपूर्ति की जाती है। ActionDispatch::Http::URL.tld_length लिए ActionDispatch::Http::URL.tld_length , जो बदले में ActionDispatch::Http::URL.tld_length से 1 हो जाता है।

  • :port - वैकल्पिक रूप से कनेक्ट करने के लिए पोर्ट निर्दिष्ट करें।

  • :anchor - एक एंकर का नाम पथ के लिए जोड़ा जाएगा।

  • :trailing_slash - यदि सही है, तो एक अनुगामी स्लैश जोड़ता है, जैसा कि "/ संग्रह / 2009 /" में है।

  • :script_name - डोमेन रूट के सापेक्ष एप्लिकेशन पथ निर्दिष्ट करता है। यदि प्रदान किया जाता है, तो आवेदन पथ तैयार करता है।

url_for को दी गई कोई भी अन्य कुंजी ( :controller , :action , इत्यादि) रूट्स मॉड्यूल को भेज दी url_for है।

url_for controller: 'tasks', action: 'testing', host: 'somehost.org', port: '8080'
# => 'http://somehost.org:8080/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', anchor: 'ok', only_path: true
# => '/tasks/testing#ok'
url_for controller: 'tasks', action: 'testing', trailing_slash: true
# => 'http://somehost.org/tasks/testing/'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', number: '33'
# => 'http://somehost.org/tasks/testing?number=33'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp"
# => 'http://somehost.org/myapp/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp", only_path: true
# => '/myapp/tasks/testing'

वर्तमान अनुरोध के मापदंडों (जैसे :controller :action :id और पथ में रखे गए किसी भी अन्य पैरामीटर) से गुम मार्ग कुंजी को भरा जा सकता है। यह देखते हुए कि वर्तमान कार्रवाई GET /users/1 माध्यम से हुई है:

url_for(only_path: true)                        # => '/users/1'
url_for(only_path: true, action: 'edit')        # => '/users/1/edit'
url_for(only_path: true, action: 'edit', id: 2) # => '/users/2/edit'

ध्यान दें कि कोई भी :id पैरामीटर पहले url_for कॉल के लिए प्रदान नहीं किया गया था और सहायक ने मार्ग के पथ से एक का उपयोग किया था। url_for द्वारा उपयोग किए जाने वाले किसी भी पथ पैरामीटर को हमेशा अंतिम url_for कॉल पर दिखाए गए की तरह अधिलेखित किया जा सकता है।

# File actionpack/lib/action_dispatch/routing/url_for.rb, line 114
def url_options
  default_url_options
end

default_url_options साथ अनुरोध जानकारी जोड़ने के लिए नियंत्रक में हुक ओवरराइड किया गया। अनुप्रयोग तर्क url_options में नहीं जाना चाहिए।

संरक्षित उदाहरण तरीके

optimize_routes_generation? () स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 218
def optimize_routes_generation?
  _routes.optimize_routes_generation? && default_url_options.empty?
end

निजी उदाहरण तरीके

# File actionpack/lib/action_dispatch/routing/url_for.rb, line 231
def _routes_context # :doc:
  self
end
_with_routes (मार्ग) {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 224
def _with_routes(routes) # :doc:
  old_routes, @_routes = @_routes, routes
  yield
ensure
  @_routes = old_routes
end