Ruby on Rails 5.2 - ActionDispatch::Routing::Mapper::CustomUrls

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




ruby

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

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

प्रत्यक्ष (नाम, विकल्प = {}, और ब्लॉक) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2097
def direct(name, options = {}, &block)
  unless @scope.root?
    raise RuntimeError, "The direct method can't be used inside a routes scope block"
  end

  @set.add_url_helper(name, options, &block)
end

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

direct :homepage do
  "http://www.rubyonrails.org"
end

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :main do
  { controller: "pages", action: "index", subdomain: "www" }
end

direct पारित ब्लॉक से वापसी मूल्य url_for लिए तर्क का एक वैध सेट होना चाहिए जो वास्तव में URL स्ट्रिंग का निर्माण करेगा। यह निम्नलिखित में से एक हो सकता है:

  • एक स्ट्रिंग, जिसे एक उत्पन्न URL के रूप में माना जाता है

  • हैश, उदाहरण के लिए { controller: "pages", action: "index" }

  • एक सरणी, जिसे polymorphic_url को पास किया गया polymorphic_url

  • एक सक्रिय मॉडल उदाहरण

  • एक सक्रिय मॉडल वर्ग

नोट: अन्य URL हेल्पर्स को ब्लॉक में बुलाया जा सकता है लेकिन अपने कस्टम URL हेल्पर को फिर से इनवॉइस न करने के लिए सावधान रहें अन्यथा इसके परिणामस्वरूप स्टैक ओवरफ़्लो त्रुटि होगी।

आप डिफ़ॉल्ट विकल्प भी निर्दिष्ट कर सकते हैं जो आपके URL सहायक परिभाषा से होकर गुजरेगा, जैसे:

direct :browse, page: 1, size: 10 do |options|
  [ :products, options.merge(params.permit(:page, :size).to_h.symbolize_keys) ]
end

इस उदाहरण में params ऑब्जेक्ट उस संदर्भ से आता है जिसमें ब्लॉक निष्पादित होता है, उदाहरण के लिए नियंत्रक क्रिया या दृश्य के अंदर URL जनरेट करना। यदि ब्लॉक निष्पादित किया जाता है जहां इस तरह के एक params ऑब्जेक्ट नहीं है:

Rails.application.routes.url_helpers.browse_path

तो यह एक NameError बढ़ाएगा। इस वजह से आपको उस संदर्भ के बारे में पता होना चाहिए जिसमें आप इसे परिभाषित करते समय अपने कस्टम URL सहायक का उपयोग करेंगे।

नोट: direct विधि का उपयोग किसी स्कोप ब्लॉक जैसे namespace या scope अंदर नहीं किया जा सकता है और यदि यह है कि यह पता लगाता है तो कोई त्रुटि उत्पन्न करेगा।

समाधान (* args, और ब्लॉक) दिखाएँ स्रोत
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 2149
def resolve(*args, &block)
  unless @scope.root?
    raise RuntimeError, "The resolve method can't be used inside a routes scope block"
  end

  options = args.extract_options!
  args = args.flatten(1)

  args.each do |klass|
    @set.add_polymorphic_mapping(klass, options, &block)
  end
end

URL को मॉडल के कस्टम पॉलीमोर्फिक मैपिंग परिभाषित करें। यह polymorphic_url के व्यवहार को बदल देता polymorphic_url और फलस्वरूप जब एक मॉडल उदाहरण दिया जाता है, तो form_for और form_for के व्यवहार को उदा।

resource :basket

resolve "Basket" do
  [:basket]
end

यह अब "/ बास्केट" उत्पन्न करेगा जब मानक के बजाय एक Basket उदाहरण को form_for to या form_for जाता है "/ बास्केट /: आईडी"।

नोट: यह कस्टम व्यवहार केवल साधारण पॉलीमॉर्फिक URL पर लागू होता है जहाँ एक एकल मॉडल उदाहरण पास किया जाता है और अधिक जटिल रूप नहीं, उदाहरण के लिए:

# config/routes.rb
resource :profile
namespace :admin do
  resources :users
end

resolve("User") { [:profile] }

# app/views/application/_menu.html.erb
link_to "Profile", @current_user
link_to "Profile", [:admin, @current_user]

पहला link_to "/ प्रोफाइल" उत्पन्न करेगा, लेकिन दूसरा "/ व्यवस्थापक / उपयोगकर्ताओं / 1" के मानक बहुरूपिक URL उत्पन्न करेगा।

आप एक पॉलीमॉर्फिक मैपिंग के विकल्प पास कर सकते हैं - ब्लॉक के लिए आर्इटी को दो होने की आवश्यकता है क्योंकि उदाहरण पहले तर्क के रूप में पारित किया गया है, जैसे:

resolve "Basket", anchor: "items" do |basket, options|
  [:basket, options]
end

यह URL "/ बास्केट # आइटम" उत्पन्न करता है क्योंकि जब polymorphic_url को दिए गए सरणी में अंतिम आइटम एक हैश होता है तो उसे URL सहायक के विकल्प के रूप में माना जाता है जो इसे कहा जाता है

नोट: resolve पद्धति का उपयोग किसी स्कोप ब्लॉक जैसे namespace या scope अंदर नहीं किया जा सकता है और यदि यह है कि यह पता लगाता है तो कोई त्रुटि उत्पन्न करेगा।