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

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




ruby

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

पॉलीमॉर्फिक URL हेल्पर्स एक एक्टिव रिकॉर्ड मॉडल उदाहरण दिए जाने पर एक नामित रूट कॉल के लिए स्मार्ट रिज़ॉल्यूशन के तरीके हैं। इनका उपयोग ActionController :: Resources के संयोजन में किया जाना है।

जब आप प्रश्न में रिकॉर्ड के सटीक प्रकार को जाने बिना किसी सही संसाधन पर सही URL या पथ बनाना चाहते हैं तो ये विधियाँ उपयोगी हैं।

उदाहरण के रूप में चित्रित नेस्टेड संसाधन और / या नामस्थान भी समर्थित हैं:

polymorphic_url([:admin, @article, @comment])

का परिणाम:

admin_article_comment_url(@article, @comment)

ढांचे के भीतर उपयोग

पॉलीमोर्फिक यूआरएल हेल्पर्स पूरे रेल ढांचे में कई स्थानों पर उपयोग किए जाते हैं:

  • url_for , इसलिए आप इसे तर्क के रूप में रिकॉर्ड के साथ उपयोग कर सकते हैं, उदाहरण के लिए url_for(@article) ;

  • ActionView::Helpers::FormHelper polymorphic_path का उपयोग करता polymorphic_path , इसलिए आप form_for(@article) को निर्दिष्ट किए बिना लिख ​​सकते हैं :url फॉर्म कार्रवाई के लिए :url पैरामीटर;

  • redirect_to (जो वास्तव में, url_for का उपयोग करता है) ताकि आप अपने नियंत्रकों में redirect_to(post) लिख सकें;

  • ActionView::Helpers::AtomFeedHelper , इसलिए आपको फ़ीड प्रविष्टियों के लिए URL को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है।

उपसर्ग बहुरूपिक सहायक

polymorphic_url और polymorphic_path विधियों के अलावा, कई उपसर्ग सहायक मदद करने के लिए विकल्प के रूप में उपलब्ध हैं action: "..." विकल्पों में। वो है:

  • edit_polymorphic_url , edit_polymorphic_path

  • new_polymorphic_url , new_polymorphic_path

उदाहरण का उपयोग:

edit_polymorphic_path(@post)           # => "/posts/1/edit"
polymorphic_path(@post, format: :pdf)  # => "/posts/1.pdf"

घुड़सवार इंजन के साथ उपयोग

यदि आप एक घुड़सवार इंजन का उपयोग कर रहे हैं और आपको इंजन के मार्गों पर इंगित #polymorphic_url का उपयोग करने की आवश्यकता है, तो विधि के पहले तर्क के रूप में इंजन के मार्ग प्रॉक्सी में पास करें। उदाहरण के लिए:

polymorphic_url([blog, @post])  # calls blog.post_path(@post)
form_for([blog, @post])         # => "/blog/posts/1"

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

polymorphic_path (record_or_hash_or_array, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/polymorphic_routes.rb, line 125
def polymorphic_path(record_or_hash_or_array, options = {})
  if Hash === record_or_hash_or_array
    options = record_or_hash_or_array.merge(options)
    record  = options.delete :id
    return polymorphic_path record, options
  end

  if mapping = polymorphic_mapping(record_or_hash_or_array)
    return mapping.call(self, [record_or_hash_or_array, options], true)
  end

  opts   = options.dup
  action = opts.delete :action
  type   = :path

  HelperMethodBuilder.polymorphic_method self,
                                         record_or_hash_or_array,
                                         action,
                                         type,
                                         opts
end

दिए गए रिकॉर्ड के लिए URL का पथ घटक लौटाता है। यह routing_type: :path साथ polymorphic_url का उपयोग करता polymorphic_url

polymorphic_url (record_or_hash_or_array, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/polymorphic_routes.rb, line 101
def polymorphic_url(record_or_hash_or_array, options = {})
  if Hash === record_or_hash_or_array
    options = record_or_hash_or_array.merge(options)
    record  = options.delete :id
    return polymorphic_url record, options
  end

  if mapping = polymorphic_mapping(record_or_hash_or_array)
    return mapping.call(self, [record_or_hash_or_array, options], false)
  end

  opts   = options.dup
  action = opts.delete :action
  type   = opts.delete(:routing_type) || :url

  HelperMethodBuilder.polymorphic_method self,
                                         record_or_hash_or_array,
                                         action,
                                         type,
                                         opts
end

दिए गए रिकॉर्ड के लिए नामांकित मार्ग पर कॉल का निर्माण करता है और परिणामी URL स्ट्रिंग लौटाता है। उदाहरण के लिए:

# calls post_url(post)
polymorphic_url(post) # => "http://example.com/posts/1"
polymorphic_url([blog, post]) # => "http://example.com/blogs/1/posts/1"
polymorphic_url([:admin, blog, post]) # => "http://example.com/admin/blogs/1/posts/1"
polymorphic_url([user, :blog, post]) # => "http://example.com/users/1/blog/posts/1"
polymorphic_url(Comment) # => "http://example.com/comments"

विकल्प

  • :action - नामित मार्ग के लिए क्रिया उपसर्ग निर्दिष्ट करता है :new या :edit । डिफ़ॉल्ट कोई उपसर्ग नहीं है।

  • :routing_type - अनुमत मान हैं :path या :url । डिफ़ॉल्ट है :url

इसके अलावा url_for से सभी विकल्प शामिल हैं। इनमें ऐसी चीजें शामिल हैं जैसे :anchor या :trailing_slash । उदाहरण का उपयोग नीचे दिया गया है:

polymorphic_url([blog, post], anchor: 'my_anchor')
  # => "http://example.com/blogs/1/posts/1#my_anchor"
polymorphic_url([blog, post], anchor: 'my_anchor', script_name: "/my_app")
  # => "http://example.com/my_app/blogs/1/posts/1#my_anchor"

इन सभी विकल्पों के लिए, url_for लिए दस्तावेज़ देखें।

कार्यक्षमता

# an Article record
polymorphic_url(record)  # same as article_url(record)

# a Comment record
polymorphic_url(record)  # same as comment_url(record)

# it recognizes new records and maps to the collection
record = Comment.new
polymorphic_url(record)  # same as comments_url()

# the class of a record will also map to the collection
polymorphic_url(Comment) # same as comments_url()