रेल्स के लिए रूटिंग संसाधनों में आईडी पैरामीटर का नाम बदलें


107

मैंने चारों ओर देखा कि गतिशील पैरामेट्स स्लॉट को कैसे बदला जाए और इस पोस्ट को मिला जो सटीक काम करता है। पोस्ट https://thoughtbot.com/blog/rails-patch-change-the-name-of-the-id-mameter-in

मूल रूप से यह क्या करता है, यदि निम्नलिखित मार्ग हैं:

map.resources :clients, :key => :client_name do |client|
  client.resources :sites, :key => :name do |site|
    site.resources :articles, :key => :title
  end
end

ये मार्ग निम्नलिखित मार्ग बनाते हैं:

/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title

एक समाधान def to_paramमॉडल में विधि को ओवरराइड करना है, लेकिन मैं मॉडल को छूने के बिना यह चाहता हूं।

लेकिन इसकी रेल्स 2.x के लिए, मैं रेल्स 3 के लिए समान कैसे प्राप्त कर सकता हूं?

अपडेट करें

यह ऐप Mongoid का उपयोग कर रहा है। एआर नहीं। इसलिए, मणि के अनुकूल उपयोग नहीं किया जा सकता है।

जवाबों:


192

रेल 4 और 5

रेल 4 में, :paramविकल्प जोड़ा गया था, जो आपको वही दिखता है जो आप देख रहे हैं। आप पर एक नज़र ले जा सकते हैं 3 कोड रेल की तुलना में रेल 4 कोड

विवरण

आप इसे अपनी routes.rbफ़ाइल में आसानी से लागू कर सकते हैं :

# config/routes.rb

resources :posts, param: :slug

# app/controllers/posts_controller.rb

# ...
@post = Post.find_by(slug: params[:slug])
# ...

रेल 4 की रिलीज के रूप में, इस कार्यक्षमता को रेल गाइड में प्रलेखित किया गया है

रेल 3

दुर्भाग्य से, रेल 3 में, के लिए :keyविकल्पresources हटा दिया गया था, इसलिए आप आसानी से इस तरह से बनाए गए मार्गों के नाम को केवल एक अतिरिक्त विकल्प में पारित करके आसानी से नहीं बदल सकते।

विवरण

मुझे लगता है कि आप पहले से ही किसी भी तरह से काम कर रहे हैं, जिस तरह से आप पिछले एक साल में चाहते हैं, लेकिन मैं एक तरह से आप के प्रभाव में रेल 3 में वर्णन प्राप्त करने के लिए जाऊंगा routes.rb। यह सिर्फ to_paramविधि की तुलना में थोड़ा अधिक काम शामिल करेगा । तुम अब भी मार्गों में कस्टम पैरामीटर परिभाषित परिभाषित कर सकते हैं scopeऔर match(या इसे का चचेरे भाई get, put, post, और delete)। आप बस उस पैरामीटर नाम में लिखेंगे जिसे आप मिलानकर्ता में चाहते हैं:

get 'clients/:client_name', :to => 'clients#show', :as => client

scope 'clients/:client_name' do
  get 'sites/:name', :to => 'sites#show', :as => site
end

आपको उन सभी मार्गों को मैन्युअल रूप से जोड़ना होगा जो resourcesस्वचालित रूप से आपके लिए बनाते हैं, लेकिन यह वह हासिल करेगा जो आप खोज रहे हैं। आप पुनरावृत्ति में से कुछ को निकालने के लिए अतिरिक्त ब्लॉक के :controllerसाथ विकल्प का प्रभावी रूप से उपयोग कर सकते हैं ।scopescope


EDIT (8 मई, 2014): यह स्पष्ट करें कि उत्तर में रेल 3 और 4 दोनों की जानकारी है। सटीक लाइन नंबरों पर जाने के लिए कोड को लिंक अपडेट करें और कमिट करें ताकि वे अधिक समय तक काम करें।

EDIT (16 नवंबर, 2014): रेल 4 अब सबसे ऊपर होनी चाहिए और इसमें प्रासंगिक जानकारी शामिल होनी चाहिए क्योंकि यह पिछले कुछ समय से रेल का वर्तमान संस्करण है।

EDIT (अगस्त 9, 2016): प्रतिबिंबित करें कि समाधान अभी भी रेल 5 में काम करता है, और पुरानी लिंक को अपडेट करें।


1
इसलिए मूल रूप से, Rails3 ने रूटर में संसाधनों के विकल्प को फिर से चालू करने के लिए बनाया, लेकिन कस्टम चर नामों के लिए अतिदेय होने की आवश्यकता है ... लंगड़ा लगता है!
अगस्तिन रिडिंगर जिहल

1
यहाँ paramरेल 3 के लिए विकल्प का एक बैकपोर्ट है : gist.github.com/sj26/44ef47fe8b98b46ee32d
sj26

यह url सहायकों को तोड़ता है। अगर मैं एक वस्तु को पास करता हूँ या गुम होने के बारे में शिकायत करता हूँ तो एक सामान्य आईडी आधारित मार्ग उत्पन्न करता हूँ। यदि मैं स्लग को पास करता हूँ तो किसी भी विचार को कैसे ठीक किया जाए?
RonLugge

9
FYI करें, यदि आप नेस्टेड संसाधनों का उपयोग करते हैं, तो मूल संसाधन के लिए सर्वोपरि होगा post_slug, जो भ्रामक हो सकता है।
घीस

4
यह वास्तव में अच्छा है लेकिन अगर मैं नेस्टेड संसाधन के लिए post_post_id जैसी पेरेंट आईडी का पैरामीटर नाम नहीं चाहता तो मैं क्या कर सकता हूं?
असनाद अत्ता

45

रेल 4 में, आईडी परम को बदलने के लिए परम विकल्प पास करें। उदाहरण के लिए resources :photos, param: :photo_name/ फोटो /: photo_name उत्पन्न करेगा


1

अगर मैं आपको सही तरीके से समझूं, तो आप जो चाहते हैं, वह आपके url के client_nameबजाय idसही है?

आप to_paramअपने मॉडल में विधि को ओवरराइड करके ऐसा कर सकते हैं । आप यहाँ अधिक जानकारी प्राप्त कर सकते हैं


1
जैसा कि मैंने पहले ही उल्लेख किया है कि मेरे पास मॉडल नहीं बदलने की बाधा है। क्या उपर्युक्त उदाहरण रेल 3 में समर्थित या पदावनत नहीं है?
ऑटोडिडैक्ट

1

उसके लिए एक रत्न है, जैसे हर चीज के लिए एक रत्न है;)

मैं रेल 3 में इस तरह के व्यवहार के लिए FriendlyId का उपयोग कर रहा हूं ।

इसके लिए आपको अपने मॉडल में कुछ कोड जोड़ना होगा, जैसे:

class Client < ActiveRecord::Base
  has_friendly_id :name
end

... और यदि आपके क्लाइंट के पास URI संगत नाम नहीं हैं, तो आप उसके लिए एक स्लग का उपयोग करना चाह सकते हैं, जिसे आप कर सकते हैं has_friendly_id :name, :use_slug => true। स्लग का उपयोग करते समय, आपको जाहिर है कि उन्हें डेटाबेस में भी बनाए रखना होगा।

और जैसा कि पहले ही उल्लेख किया गया है, आप अभी भी to_paramरेल 3 के साथ चाल का उपयोग कर सकते हैं , जैसा कि यहां दस्तावेज किया गया है । हालांकि मुझे FriendlyId थोड़ा अधिक बहुमुखी लगता है।


मुझे फ्रेंडली आईडी पसंद है और मैंने कई प्रोजेक्ट्स में इस्तेमाल किया है। दरअसल मेरा ऐप Mongoid इस्तेमाल कर रहा है। और friendly_id इसे afaik का समर्थन नहीं करता है। और जैसा कि मैंने पहले ही उल्लेख किया है कि मेरा अवरोध मॉडल को बदलना नहीं है।
ऑटोडिडैक्ट

1
यदि आप मोंगॉयड का उपयोग कर रहे हैं, तो इस कार्यक्षमता को प्राप्त करने के लिए मोंगॉयड-स्लग है। यह वास्तव में उपयोग करता है to_param, लेकिन यह पृष्ठभूमि में कुछ अन्य चतुर सामान भी करता है। मुझे यहाँ लिंक मिला: stackoverflow.com/questions/4744446/…
फ्रॉस्ट

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

क्या आपने अपने नियंत्रकों को फिर से लिखने की कोशिश की है ताकि यह आपके कस्टम मार्ग कुंजियों का उपयोग करे? उदाहरण के लिए @client = Client.find(:name => param[:client_name]में ClientsController#show? वह काम कर सकता है।
फ्रॉस्ट

Client.where(:name => param[:client_name]).first, अर्थात्।
फ्रॉस्ट

0

रेल 3 में आप इस तरह से नाम स्थान और स्कोप के संयोजन का उपयोग करके आईडी कुंजी का नाम बदल सकते हैं (हालांकि बहुत अच्छा नहीं):

namespace :clients do
  scope "/:client_name" do
    namespace :sites do
      scope "/:name" do
         post "/:title" => "articles#create"
         ...
      end
    end
  end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.